using namespace std;
const int N=5e5,inf=0x3f3f3f3f;
struct node
{
int s[2],v,p,sz;
int sum,lmax,rmax,vmax,same,rev;
void init(int _v,int _p)
{
s[0]=s[1]=0;
v=_v,p=_p;
sz=1;
sum=vmax=v;
same=rev=0;
lmax=rmax=max(v,0);
}
}tr[N];
int root,nodes[N],tt;
int w[N];
int n,m;
void pushup(int x)
{
auto &u=tr[x],&l=tr[u.s[0]],&r=tr[u.s[1]];
u.sz=l.sz+r.sz+1;
u.sum=l.sum+u.v+r.sum;
u.lmax=max(l.lmax,l.sum+r.lmax+u.v);
u.rmax=max(r.rmax,r.sum+l.rmax+u.v);
u.vmax=max(max(l.vmax,r.vmax),l.rmax+r.lmax+u.v);
}
void pushdown(int x)
{
auto &u=tr[x],&l=tr[u.s[0]],&r=tr[u.s[1]];
if(u.same)
{
if(u.s[0]) l.same=1,l.v=u.v,l.sum=l.sz*l.v;
if(u.s[1]) r.same=1,r.v=u.v,r.sum=r.sz*r.v;
if(u.v>0)
{
if(u.s[0]) l.lmax=l.rmax=l.vmax=l.sum;
if(u.s[1]) r.lmax=r.rmax=r.vmax=r.sum;
}
else
{
if(u.s[0]) l.vmax=l.v,l.lmax=l.rmax=0;
if(u.s[1]) r.vmax=r.v,r.lmax=r.rmax=0;
}
u.same=u.rev=0;
}
if(u.rev)
{
l.rev^=1,r.rev^=1;
swap(l.lmax,l.rmax);
swap(r.lmax,r.rmax);
swap(l.s[0],l.s[1]);
swap(r.s[0],r.s[1]);
u.rev=0;
}
}
void rotate(int x)
{
int y=tr[x].p,z=tr[y].p;
int k=tr[y].s[1]==x;
tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
tr[x].s[k^1]=y,tr[y].p=x;
pushup(y),pushup(x);
}
void splay(int x,int k)
{
while(tr[x].p!=k)
{
int y=tr[x].p,z=tr[y].p;
if(z!=k)
if((tr[z].s[1]==y)^(tr[y].s[1]==x)) rotate(x);
else rotate(y);
rotate(x);
}
if(!k) root=x;
}
int get_k(int k)
{
int u=root;
while(u)
{
pushdown(u);
if(tr[tr[u].s[0]].sz>=k) u=tr[u].s[0];
else if(tr[tr[u].s[0]].sz+1==k) return u;
else k-=tr[tr[u].s[0]].sz+1,u=tr[u].s[1];
}
return -1;
}
int build(int l,int r,int p)
{
int mid=l+r>>1;
int u=nodes[tt--];
tr[u].init(w[mid],p);
if(l<mid) tr[u].s[0]=build(l,mid-1,u);
if(r>mid) tr[u].s[1]=build(mid+1,r,u);
pushup(u);
return u;
}
void dfs(int u)
{
if(tr[u].s[0]) dfs(tr[u].s[0]);
if(tr[u].s[1]) dfs(tr[u].s[1]);
nodes[++tt]=u;
}
int main()
{
cin.tie(0)->sync_with_stdio(0);
cout.tie(0)->sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<N;i++) nodes[++tt]=i;
tr[0].vmax=-inf,w[0]=w[n+1]=-inf;
for(int i=1;i<=n;i++) cin>>w[i];
root=build(0,n+1,0);
while(m--)
{
string op;
cin>>op;
if(op=="INSERT")
{
int pos,tot;
cin>>pos>>tot;
for(int i=0;i<tot;i++) cin>>w[i];
int l=get_k(pos+1),r=get_k(pos+2);
splay(l,0),splay(r,l);
int u=build(0,tot-1,r);
tr[r].s[0]=u;
pushup(r),pushup(l);
}
else if(op=="DELETE")
{
int pos,tot;
cin>>pos>>tot;
int l=get_k(pos),r=get_k(pos+tot+1);
splay(l,0),splay(r,l);
dfs(tr[r].s[0]);
tr[r].s[0]=0;
pushup(r),pushup(l);
}
else if(op=="MAKE-SAME")
{
int pos,tot,x;
cin>>pos>>tot>>x;
int l=get_k(pos),r=get_k(pos+tot+1);
splay(l,0),splay(r,l);
auto &son=tr[tr[r].s[0]];
son.same=1,son.v=x,son.sum=son.sz*x;
if(x>0) son.lmax=son.rmax=son.vmax=son.sum;
else son.vmax=x,son.lmax=son.rmax=0;
pushup(r),pushup(l);
}
else if(op=="REVERSE")
{
int pos,tot;
cin>>pos>>tot;
int l=get_k(pos),r=get_k(pos+tot+1);
splay(l,0),splay(r,l);
auto &son=tr[tr[r].s[0]];
son.rev^=1;
swap(son.lmax,son.rmax);
swap(son.s[0],son.s[1]);
pushup(r),pushup(l);
}
else if(op=="GET-SUM")
{
int pos,tot;
cin>>pos>>tot;
int l=get_k(pos),r=get_k(pos+tot+1);
splay(l,0),splay(r,l);
cout<<tr[tr[r].s[0]].sum<<endl;
}
else if(op=="GET")
{
int k;
cin>>k;
int l=get_k(k),r=get_k(k+2);
splay(l,0),splay(r,l);
cout<<tr[tr[r].s[0]].v<<endl;
}
else
{
int pos,tot;
cin>>pos>>tot;
int l=get_k(pos),r=get_k(pos+tot+1);
splay(l,0),splay(r,l);
cout<<tr[tr[r].s[0]].vmax<<endl;
}
}
return 0;
}