#include<bits/stdc++.h>
using namespace std;
int n,m,pos,tot,c;string s;
mt19937 rng;
struct node{int v,front,back,mx,sum,set,s,p,l,r,rev;}tr[500001];
int cnt,sta[500001],top,root;
int newnode(int v){
int p;
if(top)p=sta[--top];
else p=++cnt;
tr[p].v=tr[p].front=tr[p].back=tr[p].mx=tr[p].sum=v,
tr[p].set=-998244353,tr[p].rev=tr[p].l=tr[p].r=0,
tr[p].s=1,tr[p].p=rng();
return p;
}void update(int p){
if(!p)return;
tr[p].s=tr[tr[p].l].s+tr[tr[p].r].s+1,
tr[p].sum=tr[tr[p].l].sum+tr[tr[p].r].sum+tr[p].v;
tr[p].front=max(max(tr[tr[p].l].front,tr[tr[p].l].sum+tr[p].v+tr[tr[p].r].front),0);
tr[p].back=max(max(tr[tr[p].r].back,tr[tr[p].r].sum+tr[p].v+tr[tr[p].l].back),0);
tr[p].mx=max(tr[tr[p].l].back+tr[tr[p].r].front,0)+tr[p].v;
if(tr[p].l)tr[p].mx=max(tr[p].mx,tr[tr[p].l].mx);
if(tr[p].r)tr[p].mx=max(tr[p].mx,tr[tr[p].r].mx);
}void pushdown(int p){
if(!p)return;
if(tr[p].rev){
if(tr[p].l)tr[tr[p].l].rev^=1;
if(tr[p].r)tr[tr[p].r].rev^=1;
swap(tr[p].front,tr[p].back),
swap(tr[p].l,tr[p].r),
tr[p].rev=0;
}if(tr[p].set!=-998244353){
if(tr[p].l){
tr[tr[p].l].v=tr[p].set;
tr[tr[p].l].set=tr[p].set;
tr[tr[p].l].sum=tr[tr[p].l].s*tr[p].set;
tr[tr[p].l].front=tr[tr[p].l].back=max(tr[tr[p].l].sum,0);
tr[tr[p].l].mx=max(tr[tr[p].l].sum,tr[tr[p].l].v);
}if(tr[p].r){
tr[tr[p].r].v=tr[p].set;
tr[tr[p].r].set=tr[p].set;
tr[tr[p].r].sum=tr[tr[p].r].s*tr[p].set;
tr[tr[p].r].front=tr[tr[p].r].back=max(tr[tr[p].r].sum,0);
tr[tr[p].r].mx=max(tr[tr[p].r].sum,tr[tr[p].r].v);
}tr[p].set=-998244353;
}update(p);
}void split(int p,int k,int&l,int&r){
if(!p)return l=r=0,void();
pushdown(p);
if(tr[tr[p].l].s+1<=k)l=p,split(tr[p].r,k-tr[tr[p].l].s-1,tr[p].r,r);
else r=p,split(tr[p].l,k,l,tr[p].l);
update(p);
}int merge(int l,int r){
if(!l||!r)return l?l:r;
pushdown(l),pushdown(r);
if(tr[l].p>tr[r].p)return tr[l].r=merge(tr[l].r,r),update(l),l;
return tr[r].l=merge(l,tr[r].l),update(r),r;
}void erase(int p){
sta[top++]=p;
if(tr[p].l)erase(tr[p].l);
if(tr[p].r)erase(tr[p].r);
tr[p]=node();
}int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>c,root=merge(root,newnode(c));
for(int i=1;i<=m;i++){
cin>>s;
if(s=="INSERT"){
cin>>pos>>tot;
int x=0,y=0;
split(root,pos,x,y);
for(int j=1;j<=tot;j++)cin>>c,x=merge(x,newnode(c));
root=merge(x,y);
}if(s=="DELETE"){
cin>>pos>>tot;
int x=0,y=0,z=0;
split(root,pos-1,x,y);
split(y,tot,y,z);
root=merge(x,z);
erase(y);
}if(s=="MAKE-SAME"){
cin>>pos>>tot>>c;
int x=0,y=0,z=0;
split(root,pos-1,x,y);
split(y,tot,y,z);
tr[y].set=c,tr[y].v=c;
root=merge(x,merge(y,z));
}if(s=="REVERSE"){
cin>>pos>>tot;
int x=0,y=0,z=0;
split(root,pos-1,x,y);
split(y,tot,y,z);
tr[y].rev^=1;
root=merge(x,merge(y,z));
}if(s=="GET-SUM"){
cin>>pos>>tot;
int x=0,y=0,z=0;
split(root,pos-1,x,y);
split(y,tot,y,z);
cout<<tr[y].sum<<'\n';
root=merge(x,merge(y,z));
}if(s=="MAX-SUM")cout<<tr[root].mx<<'\n';
}
}