#include <bits/stdc++.h>
using namespace std;
int n, o, v, rt, stk[500005], top;
mt19937 rnd(time(0));
struct Info {
int ls, rs, sz, key, val, sum, res, lmax, rmax, revtg, covtg;
// ^ ^ ^ ^ ^
} t[500005];
void setrevtag(int i) {
if (!i) return;
(t[i].revtg) ^= 1;
swap(t[i].ls, t[i].rs);
swap(t[i].lmax, t[i].rmax);
}
void setcovtag(int i, int tg) {
if (!i) return;
(t[i].covtg) = tg;
(t[i].lmax) = max(0, tg * (t[i].sz));
(t[i].rmax) = (t[i].lmax);
(t[i].sum) = tg * (t[i].sz);
(t[i].res) = (t[i].lmax);
}
void push_down(int i) {
if (!i) return;
if (t[i].covtg != 114514) {
if (t[i].ls) setcovtag(t[i].ls, t[i].covtg);
if (t[i].rs) setcovtag(t[i].rs, t[i].covtg);
t[i].covtg = 114514;
}
if (t[i].revtg) {
if (t[i].ls) setrevtag(t[i].ls);
if (t[i].rs) setrevtag(t[i].rs);
t[i].revtg = 0;
}
}
void push_up(int i) {
push_down(i);
push_down(t[i].ls);
push_down(t[i].rs);
if (!i) return;
if (t[i].ls && t[i].rs) {
t[i].lmax = max({t[t[i].ls].lmax, t[t[i].ls].lmax + t[i].val, t[t[i].ls].sum + t[i].val + t[t[i].rs].lmax});
t[i].rmax = max({t[t[i].rs].rmax, t[t[i].rs].rmax + t[i].val, t[t[i].rs].sum + t[i].val + t[t[i].ls].rmax});
t[i].res = max({t[t[i].ls].res, t[t[i].rs].res, t[t[i].ls].rmax + t[i].val, t[t[i].ls].rmax + t[i].val + t[t[i].rs].lmax});
t[i].sz = t[t[i].ls].sz + t[t[i].rs].sz + 1;
t[i].sum = t[t[i].ls].sum + t[t[i].rs].sum + t[i].val;
} else if (t[i].rs) {
t[i].lmax = max({0, t[i].val, t[t[i].rs].lmax + t[i].val});
t[i].rmax = max(t[t[i].rs].rmax, t[t[i].rs].sum + t[i].val);
t[i].res = max({t[i].val, t[t[i].rs].res, t[t[i].rs].lmax + t[i].val});
t[i].sum = t[i].val + t[t[i].rs].sum;
t[i].sz = t[t[i].rs].sz + 1;
} else if (t[i].ls) {
t[i].lmax = max(t[t[i].ls].lmax, t[t[i].ls].sum + t[i].val);
t[i].rmax = max({0, t[t[i].ls].rmax + t[i].val, t[i].val});
t[i].res = max({t[i].val, t[t[i].ls].res, t[t[i].ls].rmax + t[i].val});
t[i].sum = t[i].val + t[t[i].ls].sum;
t[i].sz = t[t[i].ls].sz + 1;
} else {
t[i].lmax = max(t[i].val, 0);
t[i].rmax = max(t[i].val, 0);
t[i].res = max(t[i].val, 0);
t[i].sum = t[i].val;
t[i].sz = 1;
}
}
int make(int val) {
/*
int ls, rs, sz, key, val, sum, res, lmax, rmax, revtg, covtg;
*/
if (!top) assert(0);
int it = stk[top--];
t[it].sz = 1;
t[it].key = rnd();
t[it].sum = val;
t[it].val = val;
t[it].rmax = t[it].res = t[it].lmax = max(0, val);
t[it].revtg = 0;
t[it].covtg = 114514;
return it;
}
void split(int u, int x, int &l, int &r) {
if (!u) return l = r = 0, void();
push_down(u);
if (t[t[u].ls].sz < x) {
l = u;
split(t[u].rs, x - t[t[u].ls].sz - 1, t[u].rs, r);
} else {
r = u;
split(t[u].ls, x, l, t[u].ls);
}
push_up(u);
}
void clear(int i) {
if (!i) return;
clear(t[i].ls);
clear(t[i].rs);
stk[++top] = i;
t[i] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
}
int merge(int x, int y) {
if (!x || !y) return x | y;
if (t[x].key < t[y].key) {
push_down(x);
t[x].rs = merge(t[x].rs, y);
push_up(x);
return x;
} else {
push_down(y);
t[y].ls = merge(x, t[y].ls);
push_up(y);
return y;
}
}
signed main(signed args, char * argv[]) {
// ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, m;
cin >> n >> m;
for (int i = 500000; i >= 1; --i) stk[++top] = i;
for (int i = 1; i <= n; ++i) {
int x; cin >> x;
rt = merge(rt, make(x));
}
string s;
while (m--) {
cin >> s;
if (s == "GET-SUM") {
int l, k, r, x, y, z;
cin >> l >> k;
r = l + k - 1;
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
cout << t[y].sum << "\n";
rt = merge(x, merge(y, z));
} else if (s == "MAX-SUM") {
cout << t[rt].res << "\n";
} else if (s == "INSERT") {
int pos, tot, u, x, y;
cin >> pos >> tot;
split(rt, pos, x, y);
while (tot--) {
cin >> u;
x = merge(x, make(u));
}
rt = merge(x, y);
} else if (s == "DELETE") {
int l, k, r, x, y, z;
cin >> l >> k;
r = l + k - 1;
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
clear(y);
rt = merge(x, z);
} else if (s == "MAKE-SAME") {
int l, k, r, c, x, y, z;
cin >> l >> k >> c;
r = l + k - 1;
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
setcovtag(y, c);
rt = merge(x, merge(y, z));
} else if (s == "REVERSE") {
int l, k, r, x, y, z;
cin >> l >> k;
r = l + k - 1;
split(rt, l - 1, x, y);
split(y, r - l + 1, y, z);
setrevtag(y);
rt = merge(x, merge(y, z));
} else assert(0);
}
return 0;
}
求调