#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int inf=1e9;
mt19937 rnd(19260817);
int n,m,node,rt;
int stac[500005],tp;
int lazy1[500005],lazy2[500005];
struct XXX{
int l,r,key;
int siz,val;
int pre,suf;
int sum,mx;
}tree[500005];
void modify(int x,int a,int b){
tree[x].sum=a*b;
tree[x].pre=tree[x].suf=tree[x].mx=(a<0?a:a*b);
}
int add(int x){
int newid=(tp>0?stac[tp--]:++node);
tree[newid].siz=1;tree[newid].key=rnd();
tree[newid].val=x;
tree[newid].pre=x;tree[newid].suf=x;
tree[newid].sum=x;tree[newid].mx=x;
lazy2[newid]=1e16;
lazy1[newid]=0;
return newid;
}
void pushdown(int x){
if(lazy1[x]){
lazy1[tree[x].l]^=1,lazy1[tree[x].r]^=1;
swap(tree[tree[x].l].pre,tree[tree[x].l].suf);
swap(tree[tree[x].r].pre,tree[tree[x].r].suf);
swap(tree[x].l,tree[x].r);
lazy1[x]=0;
}
if(lazy2[x]!=1e16){
lazy2[tree[x].l]=lazy2[tree[x].r]=tree[tree[x].l].val=tree[tree[x].r].val=lazy2[x];
modify(tree[x].l,lazy2[x],tree[tree[x].l].siz);
modify(tree[x].r,lazy2[x],tree[tree[x].r].siz);
lazy2[x]=1e16;
}
}
void pushup(int x){
tree[x].siz=tree[tree[x].l].siz+tree[tree[x].r].siz+1;
tree[x].sum=tree[tree[x].l].sum+tree[tree[x].r].sum+tree[x].val;
tree[x].pre=max(max(tree[tree[x].l].pre,tree[tree[x].l].sum+tree[x].val+tree[tree[x].r].pre),0ll);
tree[x].suf=max(max(tree[tree[x].r].suf,tree[tree[x].r].sum+tree[x].val+tree[tree[x].l].suf),0ll);
tree[x].mx=max(tree[x].val,tree[x].val+tree[tree[x].l].suf+tree[tree[x].r].pre);
if(tree[x].l) tree[x].mx=max(tree[x].mx,tree[tree[x].l].mx);
if(tree[x].r) tree[x].mx=max(tree[x].mx,tree[tree[x].r].mx);
}
void split(int x,int k,int &l,int &r){
if (!x){
l=r=0;
return;
}
pushdown(x);
if(tree[tree[x].l].siz>=k){
r=x;
split(tree[x].l,x,l,tree[x].l);
}
else{
l=x;
split(tree[x].r,k-tree[tree[x].l].siz-1,tree[x].r,r);
}
pushup(x);
}
int merge(int l,int r){
if(!l||!r){
return l+r;
}
pushdown(l);
pushdown(r);
if(tree[l].key<tree[r].key){
tree[l].r=merge(tree[l].r,r);
pushup(l);
return l;
}
else{
tree[r].l=merge(l,tree[r].l);
pushup(r);
return r;
}
}
void clean(int x){
if(!x) return;
clean(tree[x].l);clean(tree[x].r);
tree[x]={0,0,0,0,0,-inf,-inf,0,-inf};
lazy1[x]=0;
lazy2[x]=0;
stac[++tp]=x;
}
signed main(){
tree[0]={0,0,0,0,-inf,-inf,0,-inf};
// srand(time(0));
n=read();
int Q=read();
for(int i=1;i<=n;i++){
int x=read();
rt=merge(rt,add(x));
}
while(Q--){
string s;
int x,y,z;
cin>>s;
if(s=="INSERT"){
int p=read(),t=read();
int gg=0,x=0,y=0;
for(int i=1;i<=t;i++)
gg=merge(gg,add(read()));
split(rt,p,x,y);
rt=merge(merge(x,gg),y);
}
if(s=="DELETE"){
int p=read(),t=read();
split(rt,p+t-1,x,z);
split(x,p-1,x,y);
clean(y);
rt=merge(x,z);
}
if(s=="MAKE-SAME"){
int p=read(),t=read();
split(rt,p+t-1,x,z);
split(x,p-1,x,y);
lazy2[y]=tree[y].val=read();
modify(y,tree[y].val,tree[y].siz);
rt=merge(merge(x,y),z);
}
if(s=="REVERSE"){
int p=read(),t=read();
split(rt,p+t-1,x,z);
split(x,p-1,x,y);
lazy1[y]^=1;
rt=merge(merge(x,y),z);
}
if(s=="GET-SUM"){
int p=read(),t=read();
split(rt,p+t-1,x,z);
split(x,p-1,x,y);
printf("%d\n",tree[y].sum);
rt=merge(merge(x,y),z);
}
if(s=="MAX-SUM"){
printf("%d\n",tree[rt].mx);
}
}
return 0;
}
rt 过不了阳历