#include<bits/stdc++.h>
#define N 500001
using namespace std;
unsigned long long seed=1;
int n,m;
struct FHQ_Treep_Interval{
int rt,now,insters[N*10];
stack<int> rub;
struct node{
int l,r,siz,val,rnd,tag,cval,rev;
int sum,mpre,msuc,msum;
}tr[N];
inline void pushup(int x){
tr[x].siz=tr[tr[x].l].siz+tr[tr[x].r].siz+1;
tr[x].sum=tr[tr[x].l].sum+tr[tr[x].r].sum+tr[x].val;
tr[x].mpre=max({tr[tr[x].l].sum+tr[x].val+tr[tr[x].r].mpre,tr[tr[x].l].mpre,0});
tr[x].msuc=max({tr[tr[x].l].msuc+tr[x].val+tr[tr[x].r].sum,tr[tr[x].r].msuc,0});
tr[x].msum=max(tr[x].val+tr[tr[x].l].msuc+tr[tr[x].r].mpre,tr[x].val);
if(tr[x].l)tr[x].msum=max(tr[x].msum,tr[tr[x].l].msum);
if(tr[x].r)tr[x].msum=max(tr[x].msum,tr[tr[x].r].msum);
}
inline void cover(int x){
if(!tr[x].tag)return;
tr[x].val=tr[x].cval;
tr[x].sum=tr[x].cval*tr[x].siz;
tr[x].mpre=tr[x].msuc=max(0,tr[x].sum);
tr[x].msum=max(tr[x].cval,tr[x].sum);
tr[tr[x].l].tag=tr[x].tag;
tr[tr[x].r].tag=tr[x].tag;
tr[tr[x].l].cval=tr[x].cval;
tr[tr[x].r].cval=tr[x].cval;
if(tr[x].l)pushdown(tr[x].l);
if(tr[x].r)pushdown(tr[x].r);
tr[x].tag=0;
tr[x].cval=0;
}
inline void dorev(int x){
if(!tr[x].rev)return;
swap(tr[x].l,tr[x].r);
swap(tr[x].mpre,tr[x].msuc);
tr[tr[x].l].rev^=1;
tr[tr[x].r].rev^=1;
tr[x].rev=0;
return;
}
inline void pushdown(int x){
if(!x)return;
dorev(x);
if(tr[x].l)dorev(tr[x].l);
if(tr[x].r)dorev(tr[x].r);
cover(x);
if(tr[x].l)cover(tr[x].l);
if(tr[x].r)cover(tr[x].r);
}
inline int newnode(int val){
int t;
if(!rub.empty())t=rub.top(),rub.pop();
else t=++now;
memset(&tr[t],0,sizeof(tr[t]));
tr[t].siz=1;
tr[t].sum=tr[t].msum=tr[t].val=val;
tr[t].mpre=tr[t].msuc=max(0,val);
tr[t].rnd=rand();
return t;
}
inline void help_split(int& x,int& y,int& z,int k,int tot){
int l=k,r=k+tot-1;
split(rt,r,x,z);
split(x,l-1,x,y);
}
void split(int p,int k,int& x,int& y){
if(!p){x=y=0;return;}
pushdown(p);
if(tr[tr[p].l].siz<k){
x=p;
k-=tr[tr[p].l].siz+1;
split(tr[p].r,k,tr[p].r,y);
}else{
y=p;
split(tr[p].l,k,x,tr[p].l);
}
pushup(p);
}
int merge(int x,int y){
if(!x||!y)return x+y;
if(tr[x].rnd<tr[y].rnd){
pushdown(x);
tr[x].r=merge(tr[x].r,y);
pushup(x);
return x;
}
else{
pushdown(y);
tr[y].l=merge(x,tr[y].l);
pushup(y);
return y;
}
}
int build(int l,int r){
if(l==r)return newnode(insters[l]);
int mid=l+r>>1;
return merge(build(l,mid),build(mid+1,r));
}
inline void insert1(int k,int tot){
int x,y;
split(rt,k,x,y);
int z=build(1,tot);
rt=merge(merge(x,z),y);
}
inline void insert(int k,int tot){
int x,y;
split(rt,k,x,y);
x=merge(x,build(1,tot));
rt=merge(x,y);
}
void recl(int p){
if(!p)return;
rub.push(p);
recl(tr[p].l),recl(tr[p].r);
}
inline void del(int k,int tot){
int x,y,z;
help_split(x,y,z,k,tot);
recl(y);
rt=merge(x,z);
}
inline int getsum(int k,int tot){
int x,y,z,res;
help_split(x,y,z,k,tot);
res=tr[y].sum;
rt=merge(merge(x,y),z);
return res;
}
inline int maxsum(){return tr[rt].msum;}
inline void update_s(int k,int tot,int c){
int x,y,z;
help_split(x,y,z,k,tot);
tr[y].tag=1;
tr[y].cval=c;
cover(y);
rt=merge(merge(x,y),z);
return;
}
inline void reverse(int k,int tot){
int x,y,z;
help_split(x,y,z,k,tot);
tr[y].rev^=1;
dorev(y);
rt=merge(merge(x,y),z);
}
inline void build1(int val){rt=merge(rt,newnode(val));}
void output(int p) {
if(!p)return;
pushdown(p);
output(tr[p].l);
printf("%d ", tr[p].val);
output(tr[p].r);
}
}T1;
inline void read(int &x)
{
int f=1;
x=0;
char s=getchar();
while(s<'0'||s>'9')
{
if (s=='-') f=-1;
s=getchar();
}
while(s>='0'&&s<='9')
{
x=x*10+s-'0';
s=getchar();
}
x*=f;
}
char s[21];
int main(){
srand(time(0));
read(n),read(m);
for(int i=1;i<=n;i++){
int x;
read(x);
T1.build1(x);
}
while(m--){
scanf("%9s",s);
int l,r,tot,k,c;
if(s[0]=='I'){
scanf("%d%d",&k,&tot);
for(int i=1;i<=tot;i++)
read(T1.insters[i]);
T1.insert1(k,tot);
}else if(s[0]=='D'){
read(k),read(tot);
T1.del(k,tot);
}else if(s[0]=='M'&&s[2]=='K'){
read(k),read(tot),read(c);
T1.update_s(k,tot,c);
}else if(s[0]=='R'){
read(k),read(tot);
T1.reverse(k,tot);
}else if(s[0]=='G'){
read(k);read(tot);
printf("%d\n",T1.getsum(k,tot));
}else if(s[0]=='M')printf("%d\n",T1.maxsum());
}
}