#include<bits/stdc++.h>
using namespace std;
#define N 5000005
struct FHQ_treap{
int cnt=0,root=0,t[N];
struct Node{
int ls,rs,sz;
int sum,dls,drs,ans;
int pri,key,tad,taf;
}tr[N];
void newnode(int key){
tr[++cnt]={0,0,1,key,max(key,0),max(key,0),key,rand(),key,0,0};
}
void update(int u){
int ls=tr[u].ls,rs=tr[u].rs;
tr[u].dls=max({tr[ls].dls,tr[ls].sum+tr[u].key+tr[rs].dls,0});
tr[u].drs=max({tr[rs].drs,tr[rs].sum+tr[u].key+tr[ls].drs,0});
tr[u].sz=tr[ls].sz+tr[rs].sz+1,tr[u].sum=tr[u].key+tr[ls].sum+tr[rs].sum;
tr[u].ans=max({tr[ls].ans,tr[rs].ans,tr[u].key+max(tr[ls].drs+tr[rs].dls,0)});
}
void pushdown(int u){
int &ls=tr[u].ls,&rs=tr[u].rs;
if(tr[u].taf){
swap(ls,rs),tr[u].taf=0;
if(ls) tr[ls].taf^=1;
if(rs) tr[rs].taf^=1;
}
if(tr[u].tad){
if(ls){
tr[ls].sum=tr[ls].sz*tr[u].key,tr[ls].key=tr[u].key,tr[ls].tad=1;
tr[ls].dls=tr[ls].drs=max(tr[u].tad,0),tr[ls].ans=max(tr[u].tad,tr[ls].sum);
}
if(rs){
tr[rs].sum=tr[rs].sz*tr[u].key,tr[rs].key=tr[u].key,tr[rs].tad=1;
tr[rs].dls=tr[rs].drs=max(tr[u].key,0),tr[rs].ans=max(tr[u].key,tr[rs].sum);
}
tr[u].tad=0;
}
}
void split(int u,int x,int &L,int &R){
if(!u) return L=R=0,void();
pushdown(u);
if(tr[tr[u].ls].sz<x)
L=u,split(tr[u].rs,x-tr[tr[u].ls].sz-1,tr[u].rs,R);
else
R=u,split(tr[u].ls,x,L,tr[u].ls);
update(u);
}
int merge(int L,int R){
if(!L||!R) return L+R;
if(tr[L].pri>tr[R].pri){
pushdown(L),tr[L].rs=merge(tr[L].rs,R);
return update(L),L;
}
pushdown(R),tr[R].ls=merge(L,tr[R].ls);
return update(R),R;
}
int add(int l,int r){
if(l==r) return newnode(t[l]),cnt;
int mid=(l+r)>>1;
return merge(add(l,mid),add(mid+1,r));
}
void insert(int x,int y,int L=0,int R=0,int s=0){
for(int i=1;i<=y;i++) scanf("%d",t+i);
split(root,x,L,R),root=merge(merge(L,add(1,y)),R);
}
void erase(int l,int r,int L=0,int p=0,int R=0){
split(root,l-1,L,p),split(p,r,p,R);
root=merge(L,R);
}
void make_same(int x,int l,int r,int L=0,int p=0,int R=0){
split(root,l-1,L,p),split(p,r,p,R);
tr[p].sum=tr[p].sz*x,tr[p].tad=1,tr[p].key=x;
tr[p].dls=tr[p].drs=max(x,0),tr[p].ans=max(x,tr[p].sum);
root=merge(merge(L,p),R);
}
void reverse(int l,int r,int L=0,int p=0,int R=0){
split(root,l-1,L,p),split(p,r,p,R);
tr[p].taf^=1,root=merge(merge(L,p),R);
}
int query_sum(int l,int r,int L=0,int p=0,int R=0){
split(root,l-1,L,p),split(p,r,p,R);
int res=tr[p].sum;
return root=merge(merge(L,p),R),res;
}
}FHQ;
int n,m;
char op[15];
int main(){
scanf("%d%d",&n,&m),FHQ.insert(0,n);
for(int i=1,x,y,v;i<=m;i++){
scanf("%s",op);
if(op[0]=='I') scanf("%d%d",&x,&y),FHQ.insert(x,y);
if(op[0]=='D') scanf("%d%d",&x,&y),FHQ.erase(x,y);
if(op[0]=='M'&&op[2]=='K') scanf("%d%d%d",&x,&y,&v),FHQ.make_same(v,x,y);
if(op[0]=='R') scanf("%d%d",&x,&y),FHQ.reverse(x,y);
if(op[0]=='G') scanf("%d%d",&x,&y),printf("%d\n",FHQ.query_sum(x,y));
if(op[0]=='M'&&op[2]=='X') printf("%d\n",FHQ.tr[FHQ.root].ans);
}
}