#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int n,m,idx,rt,tot,pos,c,l,r,mid,inf=INT_MAX;
int q[N],st;
struct node{
int ls,rs;
int val,heap,s;
int rever,same;
int maxl,maxr,maxt,sum;
}tr[N];
int add(int val)
{
int k=(st?q[st--]:++idx);
tr[k]={0,0,val,rand(),1,0,inf,max(val,0),max(val,0),val,val};
return k;
}
void recycle(int now)
{
node &t=tr[now];
q[++st]=now;
if(t.ls) recycle(t.ls);
if(t.rs) recycle(t.rs);
}
void chf(int now)
{
node &t=tr[now],&ls=tr[tr[now].ls],&rs=tr[tr[now].rs];
t.s=ls.s+rs.s+1;
t.sum=ls.sum+rs.sum+t.val;
t.maxt=max(max(ls.maxt,rs.maxt),ls.maxr+t.val+rs.maxl);
t.maxl=max(ls.maxl,ls.sum+t.val+rs.maxl);
t.maxr=max(rs.maxr,rs.sum+t.val+ls.maxr);
}
void chs(int now)
{
if(!now) return;
node &t=tr[now],&ls=tr[t.ls],&rs=tr[t.rs];
if(t.same!=inf)
{
int val=t.same;
ls.val=rs.val=ls.same=rs.same=val;
ls.sum=ls.s*val,rs.sum=rs.s*val;
ls.maxt=max(val,ls.sum); //最大字段和不能为空 如果val为负数 只选自己
rs.maxt=max(val,rs.sum);
ls.maxl=ls.maxr=max(0,ls.sum); //最大前后缀可以为空
rs.maxl=rs.maxr=max(0,rs.sum);
ls.rever=rs.rever=0;
t.same=inf;
}
if(t.rever)
{
swap(t.ls,t.rs);
swap(t.maxl,t.maxr);
ls.rever^=1,rs.rever^=1;
t.rever=0;
}
}
int fr(){
int x=0,flag=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=x*10+(ch-'0');
ch=getchar();
}
return x*flag;
}
void split(int now,int size,int &l,int &r)
{
if(!now) l=r=0;
else
{
chs(now);
if(tr[tr[now].ls].s+1<=size)
{
l=now;
split(tr[now].rs,size-tr[tr[now].ls].s-1,tr[now].rs,r);
}
else
{
r=now;
split(tr[now].ls,size,l,tr[now].ls);
}
chf(now);
}
}
int merge(int l,int r)
{
if(!l || !r) return l+r;
else
{
if(tr[l].heap>tr[r].heap)
{
chs(l);
tr[l].rs=merge(tr[l].rs,r);
chf(l);
return l;
}
else
{
chs(r);
tr[r].ls=merge(l,tr[r].ls);
chf(r);
return r;
}
}
}
void output(int now)
{
if(!now) return;
chs(now);
output(tr[now].ls);
printf("%d ",tr[now].val);
output(tr[now].rs);
}
int main()
{
cin>>n>>m;
tr[0].maxt=-inf;
for(int i=1;i<=n;i++) rt=merge(rt,add(fr()));
for(int i=1;i<=m;i++)
{
string s;
cin>>s;
if(s[0]=='I')
{
pos=fr(),tot=fr();
split(rt,pos,l,r);
while(tot--) l=merge(l,add(fr()));
rt=merge(l,r);
}
else if(s[0]=='D')
{
pos=fr(),tot=fr();
split(rt,pos-1,l,r);
split(r,tot,mid,r);
//recycle(mid);
rt=merge(l,r);
}
else if(s=="MAKE-SAME")
{
pos=fr(),tot=fr(),c=fr();
split(rt,pos-1,l,r);
split(r,tot,mid,r);
tr[mid].same=tr[mid].val=c;
rt=merge(merge(l,mid),r);
}
else if(s[0]=='R')
{
pos=fr(),tot=fr();
split(rt,pos-1,l,r);
split(r,tot,mid,r);
tr[mid].rever^=1;
rt=merge(merge(l,mid),r);
}
else if(s[0]=='G')
{
pos=fr(),tot=fr();
split(rt,pos-1,l,r);
split(r,tot,mid,r);
printf("%d\n",tr[mid].sum);
rt=merge(merge(l,mid),r);
}
else
{
//output(rt);
//puts("");
//printf("%d\n",tr[rt].s);
printf("%d\n",tr[rt].maxt);
}
}
return 0;
}
hack
10 20
-231 259 -231 -919 -736 609 241 907 -676 -978
INSERT 0 4 987 348 686 -575
MAKE-SAME 7 2 -841
GET-SUM 5 1
MAKE-SAME 8 4 -742
MAX-SUM
MAKE-SAME 7 4 386
GET-SUM 1 5
MAKE-SAME 2 2 -36
MAX-SUM
GET-SUM 5 3
MAKE-SAME 10 2 579
MAX-SUM
INSERT 9 3 -822 -949 -505
GET-SUM 12 5
INSERT 5 4 934 -427 -839 660
DELETE 3 4
DELETE 5 4
REVERSE 2 8
MAKE-SAME 5 3 772
REVERSE 7 6
输出
-231
2021
1215
2077
414
2077
884
答案
-231
2021
1215
2077
414
3591
884