#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline void in(int &x){
x=0;int f=1;char c=getchar();
while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=getchar();
x*=f;
}
const int N=5e5+5,inf=1e9,tl=23333;
int n,m,root,b[N];
int idx[N],tot,top,rub[N];
struct node{
int ch[2],siz,fa,val;
int addtag,revtag,sum;
int left,right,middle;
}a[N];
int mmax(int tmpx,int tmpy){
return tmpx>tmpy?tmpx:tmpy;
}
void Pushup(int x){
a[x].sum=a[x].val;a[x].siz=1;
a[x].left=a[x].right=a[x].middle=a[x].val;
if(a[x].ch[0])
a[x].sum+=a[a[x].ch[0]].sum,
a[x].siz+=a[a[x].ch[0]].siz;
if(a[x].ch[1])
a[x].sum+=a[a[x].ch[1]].sum,
a[x].siz+=a[a[x].ch[1]].siz;
a[x].middle=mmax(mmax(a[a[x].ch[0]].middle,a[a[x].ch[1]].middle),
a[a[x].ch[0]].right+a[x].val+a[a[x].ch[1]].left);
a[x].left=mmax(a[a[x].ch[0]].left,a[a[x].ch[0]].sum+a[x].val+a[a[x].ch[1]].left);
a[x].right=mmax(a[a[x].ch[1]].right,a[a[x].ch[1]].sum+a[x].val+a[a[x].ch[0]].right);
}
void Pushdown(int x){
if(a[x].addtag!=tl){
if(a[x].ch[0]){
a[a[x].ch[0]].addtag=a[a[x].ch[0]].val=a[x].addtag;
a[a[x].ch[0]].sum=a[a[x].ch[0]].siz*a[x].addtag;
a[a[x].ch[0]].left=a[a[x].ch[0]].right=mmax(a[x].addtag,0);
a[a[x].ch[0]].middle=mmax(a[a[x].ch[0]].sum,a[x].addtag);
}
if(a[x].ch[1]){
a[a[x].ch[1]].addtag=a[a[x].ch[1]].val=a[x].addtag;
a[a[x].ch[1]].sum=a[a[x].ch[1]].siz*a[x].addtag;
a[a[x].ch[1]].left=a[a[x].ch[1]].right=mmax(a[x].addtag,0);
a[a[x].ch[1]].middle=mmax(a[a[x].ch[1]].sum,a[x].addtag);
}
a[x].addtag=tl;
}
if(a[x].revtag){
if(a[x].ch[0]){
a[a[x].ch[0]].ch[0]^=a[a[x].ch[0]].ch[1]^=a[a[x].ch[0]].ch[0]^=a[a[x].ch[0]].ch[1];
a[a[x].ch[0]].left^=a[a[x].ch[0]].right^=a[a[x].ch[0]].left^=a[a[x].ch[0]].right;
a[a[x].ch[0]].revtag^=1;
}
if(a[x].ch[1]){
a[a[x].ch[1]].ch[0]^=a[a[x].ch[1]].ch[1]^=a[a[x].ch[1]].ch[0]^=a[a[x].ch[1]].ch[1];
a[a[x].ch[1]].left^=a[a[x].ch[1]].right^=a[a[x].ch[1]].left^=a[a[x].ch[1]].right;
a[a[x].ch[1]].revtag^=1;
}
a[x].revtag=0;
}
}
void Rotate(int x){
int f=a[x].fa;
int ff=a[f].fa;
bool flag=(a[f].ch[1]==x);
a[ff].ch[a[ff].ch[1]==f]=x;a[x].fa=ff;
a[f].ch[flag]=a[x].ch[flag^1];a[a[x].ch[flag^1]].fa=f;
a[x].ch[flag^1]=f;a[f].fa=x;
Pushup(f);Pushup(x);
}
void Splay(int x,int t){
while(a[x].fa!=t){
int f=a[x].fa;
int ff=a[f].fa;
if(ff!=t)
(a[f].ch[0]==x)^(a[ff].ch[0]==f)?Rotate(x):Rotate(f);
Rotate(x);
}
if(!t)root=x;
}
int Find_kth(int x){
int u=root;
if(a[u].siz<x||x<0)
return 0;
while(1){
Pushdown(u);
if(x>a[a[u].ch[0]].siz+1){
x-=a[a[u].ch[0]].siz+1;
u=a[u].ch[1];
}
else if(a[a[u].ch[0]].siz>=x)u=a[u].ch[0];
else return u;
}
}
int Split(int k,int len){
int x=Find_kth(k),y=Find_kth(k+len+1);
Splay(x,0);Splay(y,x);
return a[y].ch[0];
}
void Create_new_point(int x,int val){
a[x].middle=a[x].sum=val;
a[x].ch[0]=a[x].ch[1]=a[x].revtag=0;
a[x].addtag=tl;
a[x].left=a[x].right=mmax(val,0);
a[x].siz=1;
}
void Build_new_tree(int l,int r,int fa){
int mid=(l+r)/2;
if(l==r)
Create_new_point(idx[mid],b[mid]);
if(l<mid)Build_new_tree(l,mid-1,mid);
if(mid<r)Build_new_tree(mid+1,r,mid);
a[idx[mid]].val=b[mid];
a[idx[mid]].fa=idx[fa];
a[idx[mid]].addtag=tl;
Pushup(idx[mid]);
a[idx[fa]].ch[mid>=fa]=idx[mid];
}
int Get_empty_number(){
if(!top)return ++tot;
return rub[top--];
}
void Insert(int k,int len){
for(int i=1;i<=len;i++)idx[i]=Get_empty_number();
Build_new_tree(1,len,0);
int subroot=(1+len)/2,x=Find_kth(k+1),y=Find_kth(k+2);
Splay(x,0);Splay(y,x);
a[subroot].fa=y;
a[y].ch[0]=subroot;
Pushup(y);Pushup(x);
}
void Clear_subtree(int x){
if(a[x].ch[0])Clear_subtree(a[x].ch[0]);
if(a[x].ch[1])Clear_subtree(a[x].ch[1]);
rub[++top]=x;
a[x].ch[0]=a[x].ch[1]=a[x].fa=a[x].val=0;
a[x].left=a[x].right=a[x].middle=a[x].sum=0;
a[x].addtag=tl;a[x].revtag=0;
}
void Delete(int k,int len){
int x=Split(k,len);int y=a[x].fa;
Clear_subtree(x);
a[y].ch[0]=0;
Pushup(y);Pushup(a[y].fa);
}
void Update(int k,int len,int val){
int x=Split(k,len);int y=a[x].fa;
if(x){
a[x].addtag=a[x].val=val;
a[x].sum=a[x].siz*val;
a[x].left=a[x].right=mmax(a[x].sum,0);
a[x].middle=mmax(a[x].sum,val);
}
Pushup(y);Pushup(a[y].fa);
}
void Reverse(int k,int len){
int x=Split(k,len);int y=a[x].fa;
if(a[x].addtag!=tl)return;
a[x].ch[0]^=a[x].ch[1]^=a[x].ch[0]^=a[x].ch[1];
a[x].left^=a[x].right^=a[x].left^=a[x].right;
a[x].revtag^=1;
Pushup(y);Pushup(a[y].fa);
}
int Query(int k,int len){
int x=Split(k,len);
return a[x].sum;
}
int Max_substr(){
return a[root].middle;
}
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
in(n);in(m);
a[0].middle=b[1]=b[n+2]=-inf;
for(int i=2;i<=n+1;i++)
in(b[i]);
for(int i=1;i<=n+2;i++)
idx[i]=i;
Build_new_tree(1,n+2,0);
root=(n+3)/2;tot=n+2;
while(m--){
string opt="";cin>>opt;
puts("XLY AK IOI");
cout<<opt<<endl;
puts("ZTQ AK IOI");
if(opt=="INSERT"){
int pos,ln;in(pos);in(ln);
for(int i=1;i<=ln;i++)in(b[i]);
Insert(pos,ln);
}
if(opt=="DELETE"){
int pos,ln;in(pos);in(ln);
Delete(pos,ln);
}
if(opt=="MAKE-SAME"){
int pos,ln,tp;in(pos);in(ln);in(tp);
Update(pos,ln,tp);
}
if(opt=="REVERSE"){
int pos,ln;in(pos);in(ln);
Reverse(pos,ln);
}
if(opt=="GET-SUM"){
int pos,ln;in(pos);in(ln);
printf("%d\n",Query(pos,ln));
}
if(opt=="MAX-SUM")
printf("%d\n",Max_substr());
}
return 0;
}
```