/*
 * @Author: luxin 
 * @Date: 2020-02-08 14:43:55 
 * @Last Modified by: luxin
 * @Last Modified time: 2020-02-20 20:37:51
 */
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <cmath>
using namespace std;
#define I inline
#define R register
#define inf 107374282
#define FOR(i,begin,end) for(R int i=begin;i<=end;++i)
#define ROF(i,begin,end) for(R int i=begin;i>=end;--i)
#define maxn 1000010
#define tagnone 10000110
int a[maxn],n,m;
struct luna{
    int child[2],parent,size,sum,value,left,right,mid,rev,tag;
    I void clear(){child[1]=child[0]=parent=value=rev=0,tag=tagnone;}
}tr[maxn];
#define ls tr[o].child[0]
#define rs tr[o].child[1]
int id[maxn],cnt,rub[maxn],top,root;
I int rubbish(){
    return top?rub[top--]:++cnt;
}
I void change_value(int o,int val){
    if(!o)return;
    tr[o].tag=tr[o].value=val,
    tr[o].sum=val*tr[o].size,
    tr[o].left=tr[o].right=max(0,tr[o].sum),
    tr[o].mid=max(tr[o].sum,tr[o].value);
}
I void change_rev(int o){
    swap(ls,rs);
    swap(tr[o].left,tr[o].right);
    tr[o].rev^=1;
}
I void pushup(int o){
    luna&x=tr[ls],
        &y=tr[rs],
        &res=tr[o];
    res.sum=x.sum+y.sum+res.value;
    res.size=x.size+y.size+1;
    res.right=max(y.right,x.right+res.value+y.sum);
    res.left=max(x.left,y.left+res.value+x.sum);
    res.mid=max(max(x.mid,y.mid),x.right+y.left+res.value);
}
I void pushdown(int o){
    if(tr[o].tag!=tagnone){
        change_value(ls,tr[o].tag);
        change_value(rs,tr[o].tag);
        tr[o].tag=tagnone;
    }
    if(tr[o].rev){
        change_rev(ls);
        change_rev(rs);
        tr[o].rev=0;
    }
}
I bool identify(int o){
    return tr[tr[o].parent].child[1]==o;
}
I void connect(int o,int pa,bool flag){
    tr[o].parent=pa;
    tr[pa].child[flag]=o;
}
I void rotate(int x){
    int y=tr[x].parent;
    int r=tr[y].parent;
    bool flag_x=identify(x);
    bool flag_y=identify(y);
    int b=tr[x].child[!flag_x];
    connect(b,y,flag_x);
    connect(y,x,!flag_x);
    connect(x,r,flag_y);
    pushup(y),pushup(x);
}
I void splay(int at,int to){
    while(tr[at].parent!=to){
        int pa=tr[at].parent;
        if(tr[pa].parent!=to)
            identify(at)==identify(pa)?rotate(pa):rotate(at);
            rotate(at);
    }
    if(!to)root=at;
}
I void New(int o,int val){
    tr[o].mid=tr[o].sum=val;
    tr[o].tag=tagnone;
    tr[o].rev=0;
    tr[o].left=tr[o].right=max(val,0);
    tr[o].size=1;
    tr[o].value=val;
}
I void build(int l,int r,int fa){
    int mid=(l+r)>>1;
    int o=id[mid],pre=id[fa];
    if(l==r)New(o,a[l]);
    if(l<mid)build(l,mid-1,mid);
    if(r>mid)build(mid+1,r,mid);
    tr[o].value=a[mid],tr[o].parent=pre,tr[o].tag=tagnone;
    pushup(o);
    tr[pre].child[mid>=fa]=o;
}
I int kth(int x){
    int o=root;
    while(233){
        pushdown(o);
        if(tr[ls].size>=x)o=ls;
        else{
            if(tr[ls].size+1==x)return o;
            else x-=tr[ls].size+1,o=rs;
        }
    }
    return inf;
}
I void remove(int o){
    if(ls)remove(ls);
    if(rs)remove(rs);
    rub[++top]=o;
    tr[o].clear();
}
I int split(int k,int len){
    int x=kth(k),y=kth(k+len+1);
    splay(x,0),splay(y,x);
    return tr[y].child[0];
}
I void query(int k,int len){
    int node=split(k,len);
    printf("%d\n",tr[node].sum);
}
I void update(int x,int len,int val){
    int o=split(x,len);
    int y=tr[o].parent;
    change_value(o,val);
    pushup(y),pushup(tr[y].parent);
}
I void reverse(int x,int len){   
    int o=split(x,len);
    int y=tr[o].parent;
    change_rev(o);
    pushup(y),pushup(tr[y].parent);
}
I void eraser(int x,int len){
    int o=split(x,len);
    int y=tr[o].parent;
    remove(o);
    tr[y].child[0]=0;
    pushup(y),pushup(tr[y].parent);
}
I void insert(int k,int len){
    for(int i=1;i<=len;++i)
        scanf("%d",&a[i]),
        id[i]=rubbish();
    build(1,len,0);
    int z=id[(1+len)>>1];
    int x=kth(k+1),y=kth(k+2);
    splay(x,0),splay(y,x);
    tr[y].child[0]=z;
    tr[z].parent=y;
    pushup(y),pushup(tr[y].parent);
}
#define online
signed main(){
#ifndef online
    freopen("test.in","r",stdin);
    freopen("test.out","w",stdout);
#endif
    scanf("%d%d",&n,&m);
    tr[0].mid=a[1]=a[n+2]=-inf;
    for(int i=1;i<=n;++i)scanf("%d",&a[i+1]);
    for(int i=1;i<=n+2;++i)id[i]=i;
    build(1,n+2,0);
    root=(n+3)>>1;
    cnt=n+2;
    for(int i=1;i<=m;++i){
        string s;int x,len,y;
        cin>>s;
        if(s!="MAX-SUM")scanf("%d%d",&x,&len);
        else printf("%d\n",tr[root].mid);
        if(s=="INSERT")insert(x,len);
        if(s=="DELETE")eraser(x,len);
        if(s=="MAKE-SAME")
            scanf("%d",&y),update(x,len,y);
        if(s=="REVERSE")reverse(x,len);
        if(s=="GET-SUM")query(x,len);
    }
    return 0;
}