rt
#include <iostream>
#include <cstring>
using namespace std;
const int N = 500010, INF = 1e9;
struct Splay_Node
{
int s[2], p, v;
bool flag, chg;
int size, sum, ms, ls, rs;
void init(int _v, int _p)
{
s[0] = s[1] = 0, v = _v, p = _p;
flag = chg = false, size = 1;
sum = ms = v, ls = rs = max(0, v);
}
}tr[N];
int root, n, m;
int bin[N], top;
int w[N];
void pushup(int x)
{
Splay_Node &u = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
u.size = l.size + r.size + 1;
u.sum = l.sum + r.sum + u.v;
u.ls = max(l.ls, l.sum + u.v + r.ls);
u.rs = max(r.rs, r.sum + u.v + l.rs);
u.ms = max(max(l.ms, r.ms), l.rs + u.v + r.ls);
}
void pushdown(int x)
{
Splay_Node &u = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
if (u.chg)
{
u.chg = u.flag = false;
if (u.s[0]) l.chg = true, l.v = u.v, l.sum = l.v * l.size;
if (u.s[1]) r.chg = true, r.v = u.v, r.sum = r.v * r.size;
if (u.v > 0)
{
if (u.s[0]) l.ms = l.ls = l.rs = l.sum;
if (u.s[1]) r.ms = r.ls = r.rs = r.sum;
}
else
{
if (u.s[0]) l.ms = l.v, l.ls = l.rs = 0;
if (u.s[1]) r.ms = r.v, r.ls = r.rs = 0;
}
}
else if (u.flag)
{
l.flag = !l.flag, r.flag = !r.flag;
swap(l.s[0], l.s[1]), swap(r.s[0], r.s[1]);
swap(l.ls, l.rs), swap(r.ls, r.rs);
u.flag = 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[y].s[1] == x) ^ (tr[z].s[1] == y)) rotate(x);
else rotate(y);
rotate(x);
}
if (!k) root = x;
}
int kth(int k)
{
int u = root;
while (u)
{
if (tr[tr[u].s[0]].size >= k) u = tr[u].s[0];
else if (tr[tr[u].s[0]].size + 1 == k) return splay(u, 0), u;
else k -= tr[tr[u].s[0]].size + 1, u = tr[u].s[1];
}
return -1;
}
int build(int l, int r, int p)
{
if (l >= r) return 0;
int mid = l + r >> 1;
int u = bin[top -- ];
tr[u].init(w[mid], p);
tr[u].s[0] = build(l, mid - 1, u);
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]);
bin[ ++ top] = u;
}
int main()
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++ ) scanf("%d", &w[i]);
for (int i = 1; i < N; i ++ ) bin[ ++ top] = i;
w[0] = w[n + 1] = -INF, tr[0].ms = -INF;
root = build(0, n + 1, 0);
char op[10]; int pos, tot, x;
while (m -- )
{
scanf("%s", op);
if (*op == 'I')
{
scanf("%d%d", &pos, &tot);
for (int i = 1; i <= tot; i ++ ) scanf("%d", &w[i]);
int l = kth(pos + 1), r = kth(pos + 2);
splay(l, 0), splay(r, l);
int u = build(1, tot, r);
tr[r].s[0] = u;
pushup(r), pushup(l);
}
else if (*op == 'D')
{
scanf("%d%d", &pos, &tot);
int l = kth(pos + 1), r = kth(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[2] == 'K')
{
scanf("%d%d%d", &pos, &tot, &x);
int l = kth(pos + 1), r = kth(pos + tot + 1);
splay(l, 0), splay(r, l);
Splay_Node &u = tr[tr[r].s[0]];
u.chg = true, u.v = x, u.sum = u.size * x;
if (x > 0) u.ms = u.rs = u.ls = u.sum;
else u.ms = x, u.rs = u.ls = 0;
pushup(r), pushup(l);
}
else if (*op == 'R')
{
scanf("%d%d", &pos, &tot);
int l = kth(pos + 1), r = kth(pos + tot + 1);
splay(l, 0), splay(r, l);
Splay_Node &u = tr[tr[r].s[0]];
u.flag = !u.flag;
swap(u.s[0], u.s[1]), swap(u.ls, u.rs);
pushup(r), pushup(l);
}
else if (*op == 'G')
{
scanf("%d%d", &pos, &tot);
int l = kth(pos + 1), r = kth(pos + tot + 1);
splay(l, 0), splay(r, l);
printf("%d\n", tr[tr[r].s[0]].sum);
}
else printf("%d\n", tr[root].ms);
}
return 0;
}