#include<bits/stdc++.h>
#define AC return 0;
using namespace std;
const int maxn=5e5+1000;
int a[maxn],n,m;
mt19937 mt;
struct ODT
{
struct node
{
int ls=0,rs=0,val=0,sum=0,lmax=0,rmax=0,max_sum=0,len=0,siz=0,pri=0;
bool tag=0;
}t[maxn];
#define ls(u) t[u].ls
#define rs(u) t[u].rs
#define val(u) t[u].val
#define sum(u) t[u].sum
#define lm(u) t[u].lmax
#define rm(u) t[u].rmax
#define maxs(u) t[u].max_sum
#define len(u) t[u].len
#define siz(u) t[u].siz
#define pri(u) t[u].pri
#define tag(u) t[u].tag
int rt,cnt,st[maxn],top;
int new_node(int val,int len)
{
if(top)
{
int tmp=st[top--];
if(ls(tmp)) st[++top]=ls(tmp);
if(rs(tmp)) st[++top]=rs(tmp);
t[tmp]={0,0,val,val,max(0,val),max(0,val),max(0,val),len,len,int(mt()),0};
return tmp;
}
t[++cnt]={0,0,val,val,max(0,val),max(0,val),max(0,val),len,len,int(mt()),0};
return cnt;
}
void addtag(int u)
{
if(!u) return;
tag(u)^=1;
swap(ls(u),rs(u));
swap(lm(u),rm(u));
}
void push_up(int u)
{
lm(u)=max(max(0,lm(ls(u))),max(sum(ls(u))+len(u)*val(u),sum(ls(u))+len(u)*val(u)+lm(rs(u))));
rm(u)=max(max(0,rm(rs(u))),max(sum(rs(u))+len(u)*val(u),sum(rs(u))+len(u)*val(u)+rm(ls(u))));
maxs(u)=max(len(u)*val(u)+rm(ls(u))+lm(rs(u)),max(maxs(ls(u)),maxs(rs(u))));
sum(u)=sum(ls(u))+sum(rs(u))+val(u)*len(u);
siz(u)=siz(ls(u))+siz(rs(u))+len(u);
}
void push_down(int u)
{
if(tag(u))
{
addtag(ls(u));
addtag(rs(u));
tag(u)=0;
}
}
int merge(int l,int r)
{
if(!l||!r) return l|r;
if(pri(l)>pri(r))
{
push_down(l);
rs(l)=merge(rs(l),r);
push_up(l);
return l;
}
else
{
push_down(r);
ls(r)=merge(l,ls(r));
push_up(r);
return r;
}
}
int split_node(int u,int siz)
{
push_down(u);
int tmp=new_node(val(u),len(u)-siz);
len(u)=siz;
rs(tmp)=rs(u);
rs(u)=0;
push_up(u);
push_up(tmp);
return tmp;
}
void split(int u,int siz,int &l,int &r)
{
if(!u) return l=r=0,void();
push_down(u);
if(siz<siz(ls(u)))
{
r=u;
split(ls(u),siz,l,ls(u));
}
else if(siz>siz(ls(u))+len(u))
{
l=u;
split(rs(u),siz-siz(ls(u))-len(u),rs(u),r);
}
else
{
if(siz==siz(ls(u)))
{
l=ls(u);
r=u;
ls(u)=0;
}
else if(siz==siz(ls(u))+len(u))
{
l=u;
r=rs(u);
rs(u)=0;
}
else
{
l=u;
r=split_node(u,siz-siz(ls(u)));
}
}
push_up(u);
}
int build(int l,int r)
{
if(l>r)return 0;
int mid=(l+r)>>1,u=new_node(a[mid],1);
ls(u)=build(l,mid-1);
rs(u)=build(mid+1,r);
push_up(u);
return u;
}
void insert(int pos,int tot)
{
int u=build(1,tot),l,r;
split(rt,pos,l,r);
rt=merge(l,merge(u,r));
}
void remove(int pos,int tot)
{
int l,r,p;
split(rt,pos-1,l,p);
split(p,tot,p,r);
st[++top]=p;
rt=merge(l,r);
}
void assign(int pos,int tot,int c)
{
int l,r,p;
split(rt,pos-1,l,p);
split(p,tot,p,r);
st[++top]=p;
rt=merge(l,merge(new_node(c,tot),r));
}
void reverse(int pos,int tot)
{
int l,r,p;
split(rt,pos-1,l,p);
split(p,tot,p,r);
addtag(p);
rt=merge(l,merge(p,r));
}
int query_sum(int pos,int tot)
{
int l,r,p,sum;
split(rt,pos-1,l,p);
split(p,tot,p,r);
sum=sum(p);
rt=merge(l,merge(p,r));
return sum;
}
int query_max_sum()
{
return maxs(rt);
}
void dfs(int u)
{
if(!u) return;
dfs(ls(u));
dfs(rs(u));
push_up(u);
}
void out()
{
dfs(rt);
}
void init()
{
rt=build(1,n);
}
}t;
void solve()
{
char opt[10];
int pos,tot,c;
while(m--)
{
scanf("%s",opt+1);
if(opt[1]=='G')
{
scanf("%d%d",&pos,&tot);
printf("%d\n",t.query_sum(pos,tot));
}
else if(opt[1]=='M')
{
if(opt[3]=='X')
{
t.out();
printf("%d\n",t.query_max_sum());
}
else
{
scanf("%d%d%d",&pos,&tot,&c);
t.assign(pos,tot,c);
}
}
else if(opt[1]=='I')
{
scanf("%d%d",&pos,&tot);
for(int i=1;i<=n;++i) scanf("%d",a+i);
t.insert(pos,tot);
}
else if(opt[1]=='R')
{
scanf("%d%d",&pos,&tot);
t.reverse(pos,tot);
}
else
{
scanf("%d%d",&pos,&tot);
t.remove(pos,tot);
}
cout<<t.query_max_sum()<<" ";
t.out();
cout<<t.query_max_sum()<<endl;
}
}
void init()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",a+i);
t.init();
}
int main()
{
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
init();
solve();
AC
}