#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,inf=1e9;
struct Node{
int son[2],fa,v;
int trev,tset;
int sz,sum,val,lv,rv;
Node(int v=0,int fa=0):v(v),fa(fa){
*son=son[1]=trev=tset=0;
sz=1,sum=val=v,lv=rv=max(0,v);
}
int&operator[](bool x){
return son[x];
}
} tr[N];
#define ls(x) tr[x][0]
#define rs(x) tr[x][1]
#define Ls(x) tr[ls(x)]
#define Rs(x) tr[rs(x)]
#define fa(x) tr[x].fa
#define v(x) tr[x].v
#define sz(x) tr[x].sz
#define sum(x) tr[x].sum
#define val(x) tr[x].sum
#define lv(x) tr[x].lv
#define rv(x) tr[x].rv
#define trev(x) tr[x].trev
#define tset(x) tr[x].tset
#define isl(x,y) (ls(y)==x)
#define isr(x,y) (rs(y)==x)
#define modify(xx){\
if(type==1) xx.tset=1,xx.sum=(xx.v=v(x))*xx.sz;\
else if(type==2) xx.val=xx.lv=xx.rv=xx.sum;\
else xx.val=xx.v,xx.lv=xx.rv=0;\
}
void lrmod(int x,int type){
if(ls(x)) modify(Ls(x));
if(rs(x)) modify(Rs(x));
}
#undef modify
void pushup(int x){
sz(x)=Ls(x).sz+Rs(x).sz+1;
sum(x)=Ls(x).sum+v(x)+Rs(x).sum;
lv(x)=max(Ls(x).lv,Ls(x).sum+v(x)+Rs(x).lv);
rv(x)=max(Rs(x).rv,Rs(x).sum+v(x)+Ls(x).rv);
val(x)=max({Ls(x).val,Rs(x).val,Ls(x).rv+v(x)+Rs(x).lv});
}
void pushdown(int x){
if(tset(x)){
tset(x)=trev(x)=0;
lrmod(x,1);
if(v(x)>0) lrmod(x,2);
else lrmod(x,3);
} else if(trev(x)){
trev(x)=0,trev(ls(x))^=1,trev(rs(x))^=1;
swap(lv(ls(x)),rv(rs(x))),swap(rv(rs(x)),lv(rs(x)));
swap(Ls(x)[0],Ls(x)[1]),swap(Rs(x)[0],Rs(x)[1]);
}
}
void rotate(int x){
printf("rotate:%d\n",x),_sleep(500);
int y=fa(x),z=fa(y);
bool k=isr(x,y);
fa(tr[z][isr(y,z)]=x)=z,
fa(tr[y][k]=tr[x][!k])=y;
fa(tr[x][!k]=y)=x;
pushup(y),pushup(x);
}
int root;
void splay(int x,int k){
printf("splay:%d %d\n",x,k); _sleep(500);
for(int y,z;(y=fa(x))^k;){
if((z=fa(y))^k){
if(isr(x,y)^isr(y,z)) rotate(x);
else rotate(y);
}
rotate(x);
}
if(!k) root=x;
}
int get_k(int k){
printf("get_k k=%d\n",k);
for(int u=root,siz;u;){
printf("get_k u=%d\n",u); _sleep(500);
pushdown(u),siz=sz(ls(u));
if(siz>=k) u=ls(u);
else if(siz+1==k) return u;
else k-=siz+1,u=rs(u);
}
return -1;
}
int node[N],tot,a[N];
#define mid (l+r>>1)
int build(int l,int r,int k){
printf("build: %d %d %d\n",l,r,k); _sleep(1000);
int u=node[++tot];
tr[u]=Node(a[mid],k);
if(l<mid) ls(u)=build(l,mid-1,u);
if(mid<r) rs(u)=build(mid+1,r,u);
return pushup(u),u;
}
#undef mid
void dfs(int u){
if(ls(u)) dfs(ls(u));
if(rs(u)) dfs(rs(u));
node[++tot]=u;
}
int n,m;
main(){
cin.tie(0)->sync_with_stdio(0);
for(int i=1;i<N;++i) node[i]=i;
cin>>n>>m; val(0)=*a=a[n+1]=-inf;
for(int i=1;i<=n;++i) cin>>a[i];
root=build(0,n+1,0); char op[10];
for(int pos,n,c,l,r;m--;){
cin>>op;
#define GET1 l=get_k(pos),r=get_k(pos+n+1)
#define PLAY splay(l,0),splay(r,l)
#define PUSH pushup(r),pushup(l); break;
if(*op=='M') {
if(op[2]=='K')
cin>>pos>>n>>c;
}
else cin>>pos>>n;
switch(*op){
case'I':{
for(int i=0;i<n;++i) cin>>a[i];
l=get_k(pos+1),r=get_k(pos+2);
PLAY;
ls(r)=build(0,n-1,r);
PUSH
}
case'D':{
GET1,PLAY;
dfs(ls(r)),ls(r)=0;
PUSH
}
case'M':{
if(op[2]=='K'){
GET1,PLAY;
Ls(r).tset=1,sum(ls(r))=(v(ls(r))=c)*sz(ls(r));
if(c>0) Ls(r).val=Ls(r).lv=Ls(r).rv=Ls(r).sum;
else Ls(r).val=Ls(r).v,Ls(r).lv=Ls(r).rv=0;
PUSH
}
else {cout<<val(root)<<'\n'; break;}
}
case'R':{
GET1,PLAY;
Ls(r).trev^=1;
swap(Ls(r).lv,Ls(r).rv);
swap(Ls(r)[0],Ls(r)[1]);
PUSH
}
case'G':{
GET1,PLAY;
cout<<Ls(r).sum<<'\n';
break;
}
}
}
}