#include<bits/stdc++.h>
#define mid (l+r>>1)
#define max3(a,b,c) max(max(a,b),c)
using namespace std;
const int N=5e5+1;
int ls[N],rs[N],pri[N],siz[N],stk[N],cnt,rt,top;
struct node{
int rev,set,val,maxv,maxl,maxr,sum;
}val[N];
void cover(int x,int v){
val[x].val=v,val[x].sum=siz[x]*v;
val[x].maxl=val[x].maxr=max(0,val[x].sum);
val[x].maxv=max(v,val[x].sum);
val[x].set=1;
}
void rev(int x){
swap(ls[x],rs[x]),swap(val[x].maxl,val[x].maxr),val[x].rev^=1;
}
inline void d(int x){
if(val[x].rev)
rev(ls[x]),rev(rs[x]),val[x].rev=0;
if(val[x].set)
cover(ls[x],val[x].val),cover(rs[x],val[x].val),val[x].set=0;
}
inline void p(int x){
siz[x]=siz[ls[x]]+siz[rs[x]]+1;
val[x].sum=val[ls[x]].sum+val[rs[x]].sum+val[x].val;
val[x].maxl=max3(val[ls[x]].maxl,val[ls[x]].sum+val[x].val+val[rs[x]].maxl,0);
val[x].maxr=max3(val[rs[x]].maxr,val[rs[x]].sum+val[x].val+val[ls[x]].maxr,0);
val[x].maxv=max3(val[ls[x]].maxv,val[rs[x]].maxv,max(val[ls[x]].maxr+val[rs[x]].maxl,0)+val[x].val);
}
inline int nd(int v){
int id=top?stk[top--]:++cnt;
val[id]=(node){0,0,v,v,max(0,v),max(0,v),v};
siz[id]=1,pri[id]=rand();
return id;
}
int m(int x,int y){
if(!x||!y)return x+y;
if(pri[x]<pri[y])
return d(x),rs[x]=m(rs[x],y),p(x),x;
else
return d(y),ls[y]=m(x,ls[y]),p(y),y;
}
void s(int u,int k,int&x,int&y){
if(!u)x=y=0;
else{
d(u);
if(siz[ls[u]]<k)x=u,s(rs[u],k-siz[ls[u]]-1,rs[u],y);
else y=u,s(ls[u],k,x,ls[u]);
p(u);
}
}
void splitrng(int l,int tot,int&x,int&y,int&z){
x=y=z=0,s(rt,l-1,x,y),s(y,tot,y,z);
}
int build(vector<int>&a,int l,int r){
if(l!=r)return m(build(a,l,mid),build(a,mid+1,r));
else return nd(a[l]);
}
void del(int x){
if(!x)return;
stk[++top]=x,del(ls[x]),del(rs[x]);
}
int main(){
int n,q;
cin>>n>>q;
vector<int>a(N);
for(int i=1;i<=n;i++)cin>>a[i];
rt=build(a,1,n);
while(q--){
string op;
cin>>op;
if(op=="INSERT"){
int pos,tot;
vector<int>a;
cin>>pos>>tot;
for(int t;tot--;)cin>>t,a.emplace_back(t);
int x,y;
s(rt,pos,x,y),rt=m(m(x,build(a,0,a.size()-1)),y);
}else if(op=="DELETE"){
int pos,tot;
cin>>pos>>tot;
int x,y,z;
splitrng(pos,tot,x,y,z),del(y),rt=m(x,z);
}else if(op=="MAKE-SAME"){
int pos,tot,v;
cin>>pos>>tot>>v;
int x,y,z;
splitrng(pos,tot,x,y,z);
cover(y,v);
rt=m(m(x,y),z);
}else if(op=="REVERSE"){
int pos,tot;
cin>>pos>>tot;
int x,y,z;
splitrng(pos,tot,x,y,z);
rev(y);
rt=m(m(x,y),z);
}else if(op=="GET-SUM"){
int pos,tot;
cin>>pos>>tot;
int x,y,z;
splitrng(pos,tot,x,y,z);
cout<<val[y].sum<<"\n";
rt=m(m(x,y),z);
}else if(op=="MAX-SUM")
cout<<val[rt].maxv<<"\n";
}
return 0;
}
RT,评测链接