#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define splay spaly
using namespace std;
int n,m,sta[533333],top,v[533333],root,sum[533333],tot,r,a1,sam[533333],lazy[533333],w[533333],fa[535333],in[533333],dd[533333],son[533333][2],l,a2,ma[533333],la[533333],ra[533333];
char ss[111];
void down(int k)
{
int t;
if(lazy[k])
{
lazy[k]%=2;
if(lazy[k])
{
int t1=son[k][0];
son[k][0]=son[k][1];
son[k][1]=t1;
lazy[k]=0;
lazy[son[k][0]]++;
lazy[son[k][1]]++;
swap(la[k],ra[k]);
}
}
if(sam[k])
{
t=sam[k]==10086?0:sam[k];
v[k]=t;
if(t>=0)
sum[k]=la[k]=ma[k]=ra[k]=w[k]*t;
else
{
sum[k]=w[k]*t;
la[k]=ma[k]=ra[k]=t;
}
sam[son[k][1]]=sam[k];
sam[son[k][0]]=sam[k];
sam[k]=0;
}
}
void cmp(int k)
{
if(lazy[son[k][1]]||sam[son[k][1]])
down(son[k][1]);
if(lazy[son[k][0]]||sam[son[k][0]])
down(son[k][0]);
w[k]=w[son[k][1]]+w[son[k][0]]+1;
sum[k]=sum[son[k][0]]+sum[son[k][1]]+v[k];
if(!son[k][0])
{
if(!son[k][1])
{
la[k]=ra[k]=ma[k]=v[k];
}
else
{
la[k]=max(v[k],v[k]+la[son[k][1]]);
ra[k]=max(ra[son[k][1]],sum[k]);
ma[k]=max(ma[son[k][1]],max(la[k],ra[k]));
}
}
else
{
if(!son[k][1])
{
la[k]=max(la[son[k][0]],sum[k]);
ra[k]=max(v[k],v[k]+ra[son[k][0]]);
ma[k]=max(ma[son[k][0]],max(la[k],ra[k]));
}
else
{
la[k]=max(la[son[k][0]],max(sum[son[k][0]]+v[k],sum[son[k][0]]+v[k]+la[son[k][1]]));
ra[k]=max(ra[son[k][1]],max(sum[son[k][1]]+v[k],sum[son[k][1]]+v[k]+ra[son[k][0]]));
ma[k]=max(v[k],max(ma[son[k][0]],max(ma[son[k][1]],max(ra[son[k][0]]+v[k],max(la[son[k][1]]+v[k],la[son[k][1]]+v[k]+ra[son[k][0]])))));
}
}
}
void ins(int l,int r,int f,int u)
{
if(l>r)
return;
int k=(l+r)/2;
v[dd[k]]=in[k];
fa[dd[k]]=dd[f];
son[dd[f]][u]=dd[k];
ins(l,k-1,k,0);
ins(k+1,r,k,1);
cmp(dd[k]);
}
void zuan(int k)
{
int f=fa[k],grf=fa[f],zy=son[f][1]==k,so=son[k][!zy];
if(grf)
son[grf][son[grf][1]==f]=k;
fa[k]=grf;
fa[f]=k;
son[k][!zy]=f;
fa[so]=f;
son[f][zy]=so;
cmp(f);
cmp(k);
}
void splay(int k)
{
while(fa[k])
{
int f=fa[k],grf=fa[f];
if(grf)
{
if((son[grf][1]==f)==(son[f][1]==k))
zuan(f);
else
zuan(k);
}
zuan(k);
}
root=k;
}
void spl(int k)
{
while(fa[fa[k]])
{
int f=fa[k],grf=fa[f];
if(fa[grf])
{
if((son[grf][1]==f)==(son[f][1]==k))
zuan(f);
else
zuan(k);
}
zuan(k);
}
}
void fi(int k)
{
sum[0]=0;
w[0]=0;
while(fa[k])
{
cmp(k);
k=fa[k];
}
cmp(k);
}
int splr(int a,int b)
{
splay(a);
spl(b);
return son[a][1]==b;
}
void del(int k)
{
if(!k)
return;
sta[++top]=k;
del(son[k][0]);
del(son[k][1]);
son[k][0]=0;
son[k][1]=0;
lazy[k]=0;
sam[k]=0;
sum[k]=0;
w[k]=0;
fa[k]=0;
}
void init()
{
int i;
scanf("%d %d",&n,&m);
root=510001;
for(i=1;i<=n;i++)
{
scanf("%d",&v[i]);
fa[i]=i-1;
son[i][1]=i+1;
w[i]=n-i+2;
}
fa[1]=510001;
son[510001][1]=1;
w[510001]=n+2;
v[510001]=v[510002]=-10000;
fa[510002]=n;
son[n][1]=510002;
w[510002]=1;
top=509000-n;
fi(510002);
for(i=1;i<=top;i++)
{
sta[i]=n+top-i+1;
}
}
int find(int k)
{
int t=root;
for(;;)
{
down(t);
if(k>=w[son[t][0]]+1&&k<=w[son[t][0]]+1)
{
fi(t);
return t;
}
else if(k<=w[son[t][0]])
t=son[t][0];
else if(k>w[son[t][0]]+1)
{
k=k-1-w[son[t][0]];
t=son[t][1];
}
}
}
int main()
{
int i,t,t1,i1;
init();
for(i1=1;i1<=m;i1++)
{
scanf("%s",ss);
if(ss[0]=='I')
{
scanf("%d %d",&l,&tot);
t=find(l+1);
splr(find(l+2),t);
for(i=1;i<=tot;i++)
{
scanf("%d",&in[i]);
dd[i]=sta[top--];
}
dd[0]=t;
ins(1,tot,0,1);
fi(t);
}
if(ss[0]=='D')
{
scanf("%d %d",&l,&tot);
r=l+tot-1;
splr(find(l),find(r+2));
del(son[son[root][1]][0]);
son[son[root][1]][0]=0;
fi(son[root][1]);
}
if(ss[0]=='M'&&ss[2]=='K')
{
scanf("%d %d %d",&l,&tot,&a1);
if(!a1)
a1=10086;
r=l+tot-1;
splr(find(l),find(r+2));
sam[son[son[root][1]][0]]=a1;
down(son[son[root][1]][0]);
fi(son[son[root][1]][0]);
}
if(ss[0]=='R')
{
scanf("%d %d %d",&l,&tot,&a1);
r=l+tot-1;
splr(find(l),find(r+2));
lazy[son[son[root][1]][0]]++;
down(son[son[root][1]][0]);
fi(son[son[root][1]][0]);
}
if(ss[0]=='G')
{
scanf("%d %d",&l,&tot);
r=l+tot-1;
splr(find(l),find(r+2));
printf("%d\n",sum[son[son[root][1]][0]]);
}
if(ss[0]=='M'&&ss[2]=='X')
{
printf("%d\n",ma[root]);
}
}
return 0;
}
1500
最新推荐文章于 2019-12-04 19:08:39 发布