Rt,真的努力调过了,跪求大神。
WA 了 6 个点,都是在 10000+ 行 WA 掉的(我也觉得很神奇)。
#include <bits/stdc++.h>
#define ls ch[p][0]
#define rs ch[p][1]
using namespace std;
const int N=5e5+5,M=4e6+5;
int n,m,rt,tag[N],rev[N],a[N],id[N];
int ch[N][2],fa[N],sz[N],l[N],r[N],ma[N],sum[N],val[N];
int cnt,qhead=1,qtail,q[M];
char c[1000];
inline bool get(int x){ return x==ch[fa[x]][1]; }
inline void maintain(int p){
sz[p]=sz[ls]+sz[rs]+1;sum[p]=sum[ls]+sum[rs]+val[p];
ma[p]=r[ls]+l[rs]+val[p];
l[p]=max(l[ls],sum[ls]+val[p]+l[rs]);
r[p]=max(r[rs],sum[rs]+val[p]+r[ls]);
if(ls) ma[p]=max(ma[ls],ma[p]);
if(rs) ma[p]=max(ma[rs],ma[p]);
}
inline void down(int p){
if(tag[p]){
if(ls){
tag[ls]=val[ls]=tag[p];sum[ls]=sz[ls]*val[ls];
if(val[ls]>=0) l[ls]=r[ls]=ma[ls]=sum[ls];
else l[ls]=r[ls]=0,ma[ls]=val[ls];
}
if(rs){
tag[rs]=val[rs]=tag[p];sum[rs]=sz[rs]*val[rs];
if(val[rs]>=0) l[rs]=r[rs]=ma[rs]=sum[rs];
else l[rs]=r[rs]=0,ma[rs]=val[rs];
}
tag[p]=rev[p]=0;
}
if(rev[p]){
rev[p]=0;
if(ls) rev[ls]^=1,swap(ch[ls][0],ch[ls][1]),swap(l[ls],r[ls]);
if(rs) rev[rs]^=1,swap(ch[rs][0],ch[rs][1]),swap(l[rs],r[rs]);
}
}
inline void rotate(int x){
int y=fa[x],z=fa[y],k=get(x);if(z)ch[z][ch[z][1]==y]=x;
fa[ch[y][k]=ch[x][!k]]=y,fa[fa[ch[x][!k]=y]=x]=z;
maintain(y),maintain(x);if(z) maintain(z);
}
inline void splay(int p,int k){
for(int f;f=fa[p],f!=k;rotate(p))
if(fa[f]!=k) rotate(get(f)==get(p)?f:p);
if(!k) rt=p;
}
inline void recycle(int p){
q[++qtail]=p;
if(ls) recycle(ls);
if(rs) recycle(rs);
ls=rs=fa[p]=val[p]=l[p]=r[p]=sz[p]=ma[p]=sum[p]=tag[p]=rev[p]=0;
}
inline void build(int L,int R,int p){
int mid=L+R>>1,now=id[mid];
if(L>R) return;
if(L==R){
val[now]=a[L],fa[now]=id[p],ch[id[p]][L>=p]=now;
l[now]=r[now]=max(a[L],0),ma[now]=a[L];
sum[now]=a[L];sz[now]=1;return;
}
build(L,mid-1,mid),build(mid+1,R,mid);
fa[now]=id[p],val[now]=a[mid],ch[id[p]][mid>=p]=now;
maintain(now);
}
inline int kth(int k){
int cur=rt;
while(1){
down(cur);
if(ch[cur][0]&&k<=sz[ch[cur][0]])
cur=ch[cur][0];
else{
k-=sz[ch[cur][0]]+1;
if(k<=0) return cur;
cur=ch[cur][1];
}
}
}
inline void ins(int pos,int tot){
for(int i=1;i<=tot;i++) scanf("%d",&a[i]);
for(int i=1;i<=tot;i++){
if(qhead<=qtail) id[i]=q[qhead++];
else id[i]=++cnt;
}
build(1,tot,0);
int x=kth(pos),y=kth(pos+1);
splay(x,0),splay(y,x);
fa[ch[y][0]=id[tot+1>>1]]=y;maintain(y),maintain(x);
}
inline void del(int pos,int tot){
int x=kth(pos-1),y=kth(pos+tot);
splay(x,0),splay(y,x);
recycle(ch[y][0]);ch[y][0]=0;maintain(y),maintain(x);
}
inline void make_same(int pos,int tot,int c){
int x=kth(pos-1),y=kth(pos+tot);
splay(x,0),splay(y,x);
tag[ch[y][0]]=c;val[ch[y][0]]=c;sum[ch[y][0]]=sz[ch[y][0]]*c;
if(c>0) l[ch[y][0]]=r[ch[y][0]]=ma[ch[y][0]]=sum[ch[y][0]];
else l[ch[y][0]]=r[ch[y][0]]=0,ma[ch[y][0]]=c;
maintain(y),maintain(x);
}
inline void reverse(int pos,int tot){
int x=kth(pos-1),y=kth(pos+tot);
splay(x,0),splay(y,x);
rev[ch[y][0]]^=1;
swap(ch[ch[y][0]][0],ch[ch[y][0]][1]);
swap(l[ch[y][0]],r[ch[y][0]]);
maintain(y),maintain(x);
}
inline int query(int pos,int tot){
int x=kth(pos-1),y=kth(pos+tot);
splay(x,0),splay(y,x);
return sum[ch[y][0]];
}
int main(){
freopen("P2042_2.in","r",stdin);
freopen("2.out","w",stdout);
scanf("%d%d",&n,&m);a[1]=a[n+2]=-1e6;
for(int i=2;i<=n+1;i++) scanf("%d",&a[i]);
for(int i=1;i<=n+2;i++) id[i]=++cnt;
build(1,n+2,0);rt=id[n+3>>1];
for(int x,y,z,i=1;i<=m;i++){
scanf("%s",c+1);
if(c[1]=='I')
scanf("%d%d",&x,&y),ins(x+1,y);
else if(c[1]=='D')
scanf("%d%d",&x,&y),del(x+1,y);
else if(c[1]=='M'&&c[3]=='K')
scanf("%d%d%d",&x,&y,&z),make_same(x+1,y,z);
else if(c[1]=='R')
scanf("%d%d",&x,&y),reverse(x+1,y);
else if(c[1]=='G')
scanf("%d%d",&x,&y),printf("%d\n",query(x+1,y));
else
printf("%d\n",ma[rt]);
}
return 0;
}