恶心题WA60pts,嘤嘤嘤
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<stack>
#include<string>
using namespace std;
const int maxn=5e5;
int taga[maxn];
int tagb[maxn];
int sz[maxn];
int lm[maxn];
int rm[maxn];
int mm[maxn];
int ch[maxn][2];
int val[maxn];
int all[maxn];
int pri[maxn];
int ttt,n,m;
stack<int>st;
int root;
int nnode(int x)
{
int o;
if(!st.empty())o=st.top(),st.pop();
else o=++ttt;
taga[o]=-10000;
tagb[o]=0;
sz[o]=1;
ch[o][0]=ch[o][1]=0;
val[o]=x;all[o]=x;mm[o]=x;pri[o]=rand();
lm[o]=rm[o]=max(x,0);
return o;
}
void fz(int x)
{
if(x==0)return;
tagb[x]^=1;
swap(ch[x][0],ch[x][1]);
swap(lm[x],rm[x]);
}
void fg(int x,int y)
{
if(x==0)return;
taga[x]=y;
val[x]=y;
all[x]=y*sz[x];
lm[x]=rm[x]=max(y,0);
mm[x]=max(val[x],all[x]);
return;
}
void upd(int x)
{
if(x==0)return;
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+1;
all[x]=all[ch[x][0]]+all[ch[x][1]]+val[x];
mm[x]=max(val[x],val[x]+rm[ch[x][0]]+lm[ch[x][1]]);
if(ch[x][0])mm[x]=max(mm[x],mm[ch[x][0]]);
if(ch[x][1])mm[x]=max(mm[x],mm[ch[x][1]]);
lm[x]=max(lm[ch[x][0]],all[ch[x][0]]+val[x]+lm[ch[x][1]]);lm[x]=max(lm[x],0);
rm[x]=max(rm[ch[x][1]],all[ch[x][1]]+val[x]+rm[ch[x][0]]);rm[x]=max(rm[x],0);
}
void psdo(int x)
{
int my=-1;
if(x==0)return;
if(taga[x]!=-10000)
{
if(ch[x][0])fg(ch[x][0],taga[x]);
if(ch[x][1])fg(ch[x][1],taga[x]);
taga[x]=-10000;
}
if(tagb[x]!=0)
{
if(ch[x][0])fz(ch[x][0]);
if(ch[x][1])fz(ch[x][1]);
tagb[x]=0;
}
}
void split(int now,int k,int &x,int &y)
{
if(now==0)x=y=0;
else
{
psdo(now);
if(sz[ch[now][0]]<k)x=now,split(ch[now][1],k-sz[ch[now][0]]-1,ch[now][1],y);
else y=now,split(ch[now][0],k,x,ch[now][0]);
upd(now);
}
}
int merge(int x,int y)
{
if(x==0||y==0)return x+y;
psdo(x);psdo(y);
if(pri[x]<pri[y])
{
ch[x][1]=merge(ch[x][1],y);
upd(x);
return x;
}
else
{
ch[y][0]=merge(x,ch[y][0]);
upd(y);
return y;
}
}
void sha(int x)
{
if(x==0)return;
st.push(x);
if(ch[x][0])sha(ch[x][0]);
ch[x][0]=0;
if(ch[x][1])sha(ch[x][1]);
ch[x][1]=0;
val[x]=0,taga[x]=0,tagb[x]=0;
mm[x]=0;lm[x]=0;rm[x]=0;
}
void dfs(int x)
{
// psdo(x);
if(ch[x][0])dfs(ch[x][0]);
printf("%d ",val[x]);
if(ch[x][1])dfs(ch[x][1]);
}
string ss;
int main()
{
int i,x,ge,oo,a,b,c,d,y;
// srand(time(0));
srand(0);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
root=merge(root,nnode(x));
}
int tmp=0;
for(oo=1;oo<=m;oo++)
{
if(oo==82)
int my=-1;
cin>>ss;
if(ss=="INSERT")
{
scanf("%d%d",&x,&ge);
split(root,x,a,b);
scanf("%d",&y);
c=nnode(y);
for(i=2;i<=ge;i++)
{
scanf("%d",&y);
c=merge(c,nnode(y));
}
root=merge(merge(a,c),b);
}
else if(ss=="DELETE")
{
scanf("%d%d",&x,&ge);
split(root,x-1,a,b);
split(b,ge,c,d);
sha(c);
root=merge(a,d);
}
else if(ss=="REVERSE")
{
scanf("%d%d",&x,&ge);
split(root,x-1,a,b);
split(b,ge,c,d);
fz(c);
root=merge(a,merge(c,d));
}
else if(ss=="MAKE-SAME")
{
scanf("%d%d%d",&x,&ge,&y);
split(root,x-1,a,b);
split(b,ge,c,d);
fg(c,y);
tagb[c]=0;
root=merge(a,merge(c,d));
}
else if(ss=="GET-SUM")
{
scanf("%d%d",&x,&ge);
split(root,x-1,a,b);
split(b,ge,c,d);
cout<<all[c]<<endl;
root=merge(a,merge(c,d));
tmp++;
if(tmp==35)
int my=-1;
}
else if(ss=="GET")
{
scanf("%d",&x);
split(root,x-1,a,b);
split(b,1,c,d);
cout<<all[c]<<endl;
root=merge(a,merge(c,d));
tmp++;
if(tmp==35)
int my=-1;
}
else
{
scanf("%d%d",&x,&ge);
split(root,x-1,a,b);
split(b,ge,c,d);
cout<<mm[c]<<endl;
root=merge(a,merge(c,d));
tmp++;
if(tmp==35)
int my=-1;
}
// dfs(root);
//cout<<endl;
}
return 0;
}