蒟蒻刚学OI,FHQ-treap求调。
本地能过样例,在线IDE会WA:
(输出-1 9 1 10)
悬2关。ORZ%%%%%%。
#include<bits/stdc++.h>
using namespace std;
namespace FastIO { // 快读
inline int read() {
int x=0;bool f=0;char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-') f=1;
else f=0;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return f?-x:x;
}
void Wtt(int x) {
if(x>9)
Wtt(x/10);
putchar(48+(x%10));
}
void pt(int x) {
if(x>=0) Wtt(x);
else putchar('-'),Wtt(-x);
}
}
using namespace FastIO;
const int N = 500500;
int n,m;
struct fhq_treap { // FHQ treap
int rot=0;
int c[N];
int rnd[N],ls[N],rs[N],siz[N],cnt=0;
int prmax[N],sfmax[N];
int sq[N],sum[N];
int cov[N]; // cover ( replace )
bool rev[N]; // reverse ( abcde -> edcba )
int addpoint(int val) {
cnt++;
c[cnt]=val;
rnd[cnt]=rand();
prmax[cnt]=sfmax[cnt]=sq[cnt]=val;
sum[cnt]=val;
ls[cnt]=rs[cnt]=0;
siz[cnt]=1;
return cnt;
}
void pushup(int u) {
sum[u]=sum[ls[u]]+sum[rs[u]]+c[u];
siz[u]=siz[ls[u]]+siz[rs[u]]+1;
prmax[u]=max(prmax[ls[u]],sum[ls[u]]+c[u]+prmax[rs[u]]);
sfmax[u]=max(sfmax[rs[u]],sum[rs[u]]+c[u]+sfmax[ls[u]]);
sq[u]=max(max(sq[ls[u]],sq[rs[u]]),sfmax[ls[u]]+c[u]+prmax[rs[u]]);
}
void pushcov(int u,int val) {
c[u]=val;
sum[u]=siz[u]*val;
cov[u]=val;
if(val>0) {
sq[u]=prmax[u]=sfmax[u]=sum[u];
} else {
prmax[u]=sfmax[u]=sq[u]=val;
}
}
void pushrev(int u) {
swap(ls[u],rs[u]);
swap(prmax[u],sfmax[u]);
rev[u]^=1;
}
void pushdown(int u) {
if(cov[u]) {
if(ls[u]) pushcov(ls[u],cov[u]);
if(rs[u]) pushcov(rs[u],cov[u]);
cov[u]=0;
}
if(rev[u]) {
if(ls[u]) pushrev(ls[u]);
if(rs[u]) pushrev(rs[u]);
rev[u]=0;
}
}
int merge(int u,int v) {
if(!u||!v) return u+v;
pushdown(u),pushdown(v);
if(rnd[u]>rnd[v]) {
rs[u]=merge(rs[u],v);
pushup(u);
return u;
} else {
ls[v]=merge(u,ls[v]);
pushup(v);
return v;
}
}
void split(int now,int k,int &u,int &v) {
if(!now) {
u=0,v=0;
return;
}
pushdown(now);
if(siz[ls[now]]<k) {
u=now;
split(rs[now],k-siz[ls[now]]-1,rs[now],v);
} else {
v=now;
split(ls[now],k,u,ls[now]);
}
pushup(now);
}
void push_back(int x) {
rot=merge(rot,addpoint(x));
}
void insert(int pos,int val) {
int x,y;
split(rot,pos-1,x,y);
rot=merge(x,merge(addpoint(val),y));
}
void replace(int l,int r,int val) {
int x,y,z;
split(rot,l-1,x,y);
split(y,r-l+1,y,z);
pushcov(y,val);
rot=merge(x,merge(y,z));
}
void reverse(int l,int r) {
int x,y,z;
split(rot,l-1,x,y);
split(y,r-l+1,y,z);
pushrev(y);
rot=merge(x,merge(y,z));
}
void del(int pos,int num) {
int x,y,z;
split(rot,pos-1,x,y);
split(y,num,y,z);
rot=merge(x,z);
}
int query_sum(int l,int len) {
int x,y,z;
split(rot,l-1,x,y);
split(y,len,y,z);
int res=sum[y];
rot=merge(x,merge(y,z));
return res;
}
}tr;
char ss[40];
int main() {
n=read(),m=read();
for(int i=1;i<=n;i++) {
int u=read();
tr.push_back(u);
}
for(int i=1;i<=m;i++) {
scanf(" %s",ss+1);
if(ss[1]=='I') { //insert
int pos=read(),kk=read();
for(int j=1;j<=kk;j++) tr.insert(pos+j,read());
} else if(ss[1]=='D') { //delete
int p=read(),t=read();
tr.del(p,t);
} else if(ss[1]=='R') { //reverse
int p=read(),t=read();
tr.reverse(p,p+t-1);
} else if(ss[1]=='G') { // get-sum
int p=read(),t=read();
pt(tr.query_sum(p,t)),putchar('\n');
} else {
if(ss[3]=='K') { // make-same
int p=read(),t=read();
tr.replace(p,p+t-1,read());
} else { // max-sum
pt(tr.sq[tr.rot]),putchar('\n');
}
}
}
return 0;
}