#include<iostream>
#include<cstring>
#define int long long
using namespace std;
const int N = 5E5 + 10;
const int INF = 0x3f3f3f3f3f3f3f3f;
int n, m;
int a[N];
int root, nn;
int val[N], chd[N][2], sz[N], sum[N], pri[N];
int lans[N], rans[N], ans[N], Max[N];;
int tag_rev[N], tag_mdf[N];
int pool[N], top;
void push_up(int p) {
int lc = chd[p][0], rc = chd[p][1];
sz[p] = sz[lc] + sz[rc] + 1;
sum[p] = sum[lc] + sum[rc] + val[p];
Max[p] = max(max(Max[chd[p][0]], Max[chd[p][1]]), val[p]);
lans[p] = max(lans[lc], sum[lc] + val[p] + lans[rc]);
rans[p] = max(rans[rc], sum[rc] + val[p] + rans[lc]);
lans[p] = max(lans[p], 0ll);
rans[p] = max(rans[p], 0ll);
ans[p] = max(max(ans[lc], ans[rc]), max(lans[p], rans[p]));
ans[p] = max(ans[p], sum[p]);
ans[p] = max(ans[p], rans[lc] + lans[rc] + val[p]);
ans[p] = max(ans[p], 0ll);
}
void move_tag_rev(int p) {
swap(chd[p][0], chd[p][1]);
swap(lans[p], rans[p]);
tag_rev[p] ^= 1;
}
void move_tag_mdf(int p, int tg) {
sum[p] = sz[p] * tg;
Max[p] = tg;
val[p] = tg;
tag_mdf[p] = tg;
lans[p] = rans[p] = ans[p] = (sum[p] > 0) ? sum[p] : 0;
}
void push_down(int p) {
if(tag_rev[p] != 0) {
move_tag_rev(chd[p][0]);
move_tag_rev(chd[p][1]);
tag_rev[p] = 0;
}
if(tag_mdf[p] != INF) {
move_tag_mdf(chd[p][0], tag_mdf[p]);
move_tag_mdf(chd[p][1], tag_mdf[p]);
tag_mdf[p] = INF;
}
}
int merge(int x, int y) {
if(x == 0 || y == 0) {
return x | y;
}
if(pri[x] > pri[y]) {
push_down(x);
chd[x][1] = merge(chd[x][1], y);
push_up(x);
return x;
} else {
push_down(y);
chd[y][0] = merge(x, chd[y][0]);
push_up(y);
return y;
}
}
void split(int cur, int v, int& x, int& y) {
if(cur == 0) {
x = y = 0;
return;
}
push_down(cur);
if(sz[chd[cur][0]] + 1 <= v) {
x = cur;
split(chd[x][1], v - (sz[chd[cur][0]] + 1), chd[x][1], y);
} else {
y = cur;
split(chd[y][0], v, x, chd[y][0]);
}
push_up(cur);
}
int addNode(int v) {
int pos;
if(top != 0) {
pos = pool[top--];
} else {
pos = ++nn;
}
val[pos] = sum[pos] = v;
chd[pos][0] = chd[pos][1] = 0;
Max[pos] = v;
sz[pos] = 1;
pri[pos] = rand();
tag_rev[pos] = 0;
lans[pos] = rans[pos] = ans[pos] = max(v, 0ll);
return pos;
}
int makeTree(int l, int r, int* v) {
if(l == r) {
return addNode(v[l]);
}
int mid = (l + r) >> 1;
return merge(makeTree(l, mid, v), makeTree(mid + 1, r, v));
}
void delTree(int p) {
if(p == 0) return;
delTree(chd[p][0]);
delTree(chd[p][1]);
pool[++top] = p;
}
signed main() {
memset(tag_mdf, 0x3f, sizeof(tag_mdf));
memset(Max, -0x3f, sizeof(Max));
cin >> n >> m;
for(int i = 1; i <= n; i++) {
cin >> a[i];
}
root = makeTree(1, n, a);
while(m--) {
string op;
cin >> op;
if(op == "INSERT") {
int pos, tot;
cin >> pos >> tot;
int c[tot + 10];
for(int i = 1; i <= tot; i++) {
cin >> c[i];
}
int y = makeTree(1, tot, c);
int x, z;
split(root, pos, x, z);
root = merge(merge(x, y), z);
} else if(op == "DELETE") {
int pos, tot;
cin >> pos >> tot;
int x, y, z, w;
split(root, pos - 1, x, w);
split(w, tot, y, z);
delTree(y);
root = merge(x, z);
} else if(op == "MAKE-SAME") {
int pos, tot, c;
cin >> pos >> tot >> c;
int x, y, z, w;
split(root, pos - 1, x, w);
split(w, tot, y, z);
move_tag_mdf(y, c);
root = merge(merge(x, y), z);
} else if(op == "REVERSE") {
int pos, tot;
cin >> pos >> tot;
int x, y, z, w;
split(root, pos - 1, x, w);
split(w, tot, y, z);
move_tag_rev(y);
root = merge(merge(x, y), z);
} else if(op == "GET-SUM") {
int pos, tot;
cin >> pos >> tot;
int x, y, z, w;
split(root, pos - 1, x, w);
split(w, tot, y, z);
cout << sum[y] << endl;
root = merge(merge(x, y), z);
} else if(op == "MAX-SUM") {
if(ans[root] == 0) {
cout << Max[root] << endl;
} else cout << ans[root] << endl;
}
}
return 0;
}