#include <bits/stdc++.h>
using namespace std;
#pragma optimize(2)
#define lson t[i].ch[0]
#define rson t[i].ch[1]
const int maxn=5e5+10;
int n,m;
int a[maxn];
struct fhq_treap
{
int ch[2];
int pri,val;
int sz;
int sum,maxl,maxr,mx;
int lazyr,lazyc;
}t[maxn];
int sta[maxn],top;
int cnt,root;
int newnode(int x)
{
int id;
if(top) id=sta[top--];
else id=++cnt;
t[id].ch[0]=t[id].ch[1]=t[id].lazyr=0,t[id].lazyc=-1e5;
t[id].pri=rand();
t[id].val=t[id].sum=x;
t[id].maxl=t[id].maxr=max(0,x),t[id].mx=x;
t[id].sz=1;
return cnt;
}
void update(int i)
{
t[i].sz=t[lson].sz+t[rson].sz+1;
t[i].maxl=max(max(t[lson].maxl,t[lson].sum+t[i].val+t[rson].maxl),0);
t[i].maxr=max(max(t[rson].maxr,t[rson].sum+t[i].val+t[lson].maxr),0);
t[i].mx=max(t[i].val,t[i].val+t[lson].maxr+t[rson].maxl);
t[i].sum=t[lson].sum+t[rson].sum+t[i].val;
if(lson) t[i].mx=max(t[i].mx,t[lson].mx);
if(rson) t[i].mx=max(t[i].mx,t[rson].mx);
}
void reverse(int i)
{
if(!i) return ;
swap(lson,rson);
swap(t[i].maxl,t[i].maxr);
t[i].lazyr^=1;
}
void cover(int i,int x)
{
t[i].sum=t[i].sz*x,t[i].val=t[i].lazyc=x;
t[i].maxl=t[i].maxr=max(0,t[i].sum);
t[i].mx=t[i].sum;
}
void pushdown(int i)
{
if(!i) return ;
if(t[i].lazyr)
{
if(lson) reverse(lson);
if(rson) reverse(rson);
t[i].lazyr=0;
}
if(t[i].lazyc>-1e5)
{
if(lson) cover(lson,t[i].lazyc);
if(rson) cover(rson,t[i].lazyc);
t[i].lazyc=-1e5;
}
}
int merge(int x,int y)
{
if(x==0||y==0)
return x+y;
if(t[x].pri<t[y].pri)
{
pushdown(x);
t[x].ch[1]=merge(t[x].ch[1],y);
update(x);
return x;
}
else
{
pushdown(y);
t[y].ch[0]=merge(x,t[y].ch[0]);
update(y);
return y;
}
}
void split(int i,int k,int &x,int &y)
{
if(i==0)
{
x=0,y=0;
return ;
}
pushdown(i);
if(t[lson].sz<k)
{
x=i;
split(rson,k-t[lson].sz-1,rson,y);
}
else
{
y=i;
split(lson,k,x,lson);
}
update(i);
}
void remove(int i)
{
if(!i) return ;
sta[++top]=i;
remove(lson),remove(rson);
}
void del(int pos,int len)
{
int x,y,z;
split(root,pos-1,x,y);
split(y,len,y,z);
remove(y);
root=merge(x,z);
}
int build(int l,int r)
{
if(l==r) return newnode(a[l]);
int mid=(l+r)/2;
return merge(build(l,mid),build(mid+1,r));
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
root=merge(root,build(1,n));
char op[20];
int x,y,d,tot;
while(m--)
{
cin>>op+1;
if(op[1]=='I')
{
cin>>x>>tot;
int u,v;
split(root,x,u,v);
for(int i=1;i<=tot;i++) cin>>a[i];
u=merge(u,build(1,tot));
root=merge(u,v);
}
if(op[1]=='D')
{
cin>>x>>y;
del(x,y);
}
if(op[1]=='R')
{
cin>>x>>y;
int u,v,t;
split(root,x-1,u,v);
split(v,y,v,t);
reverse(v);
root=merge(merge(u,v),t);
}
if(op[1]=='G')
{
cin>>x>>y;
int u,v,tmp;
split(root,x-1,u,v);
split(v,y,v,tmp);
cout<<t[v].sum<<endl;
root=merge(merge(u,v),tmp);
}
if(op[1]=='M')
{
if(op[3]=='K')
{
cin>>x>>y>>d;
int u,v,t;
split(root,x-1,u,v);
split(v,y,v,t);
cover(v,d);
root=merge(merge(u,v),t);
}
else cout<<t[root].mx<<endl;
}
}
return 0;
}