调了一晚了,来个好心人救下
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
struct node {
int s[2], ms, ls, rs, sum, siz, p, v;
int same, rev;
void init(int _v, int _p) {
s[0] = s[1] = 0;
p = _p, v = _v;
siz = 1, sum = ms = v;
ls = rs = max(v, 0);
}
} tr[N];
int rt, rbs[N], tt;
int w[N];
int n, m;
#define lc(x) tr[x].s[0]
#define rc(x) tr[x].s[1]
void pushup(int u) {
tr[u].siz = tr[lc(u)].siz + tr[rc(u)].siz + 1;
tr[u].sum = tr[lc(u)].sum + tr[rc(u)].sum + tr[u].v;
tr[u].ls = max(tr[lc(u)].ls, tr[lc(u)].sum + tr[u].v + tr[rc(u)].ls);
tr[u].rs = max(tr[rc(u)].rs, tr[rc(u)].sum + tr[u].v + tr[lc(u)].rs);
tr[u].ms = max(max(tr[lc(u)].ms, tr[rc(u)].ms), tr[lc(u)].rs + tr[u].v + tr[rc(u)].ls);
}
void pushdown(int u) {
if (tr[u].same) {
tr[u].same = 0, tr[u].rev = 0;
if (lc(u)) {
tr[lc(u)].same = 1;
tr[lc(u)].v = tr[u].v;
tr[lc(u)].sum = tr[u].v * tr[lc(u)].siz;
}
if (rc(u)) {
tr[rc(u)].same = 1;
tr[rc(u)].v = tr[u].v;
tr[rc(u)].sum = tr[u].v * tr[rc(u)].siz;
}
if (tr[u].v > 0) {
if (lc(u))
tr[lc(u)].ms = tr[lc(u)].rs = tr[lc(u)].ls = tr[lc(u)].sum;
if (rc(u))
tr[rc(u)].ms = tr[rc(u)].rs = tr[rc(u)].ls = tr[rc(u)].sum;
} else {
if (lc(u))
tr[lc(u)].ms = tr[u].v, tr[lc(u)].rs = tr[lc(u)].ls = 0;
if (rc(u))
tr[rc(u)].ms = tr[u].v, tr[rc(u)].rs = tr[rc(u)].ls = 0;
}
} else if (tr[u].rev) {
tr[u].rev = 0;
tr[lc(u)].rev ^= 1;
tr[rc(u)].rev ^= 1;
swap(tr[lc(u)].ls, tr[lc(u)].rs);
swap(tr[rc(u)].ls, tr[rc(u)].rs);
swap(tr[lc(u)].s[0], tr[lc(u)].s[1]);
swap(tr[rc(u)].s[0], tr[rc(u)].s[1]);
}
}
void rotate(int x) {
int y = tr[x].p, z = tr[y].p;
bool 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)
rt = x;
}
int get_k(int k) {
int x = rt;
while (x) {
pushdown(x);
if (tr[lc(x)].siz >= k)
x = lc(x);
else if (tr[lc(x)].siz + 1 == k)
return x;
else
k -= tr[lc(x)].siz + 1, x = rc(x);
}
}
int build(int l, int r, int p) {
int mid = l + r >> 1;
int u = rbs[tt--];
tr[u].init(w[mid], p);
if (l < mid)
lc(u) = build(l, mid - 1, u);
if (r > mid)
rc(u) = build(mid + 1, r, u);
pushup(u);
return u;
}
void rec(int u) {
if (lc(u))
rec(lc(u));
if (rc(u))
rec(rc(u));
rbs[++tt] = u;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
for (int i = 1; i < N; i++)
rbs[++tt] = i;
cin >> n >> m;
tr[0].ms = -1e9;
w[0] = w[n + 1] = -1e9;
for (int i = 1; i <= n; i++)
cin >> w[i];
rt = build(0, n + 1, 0);
string opt;
while (m--) {
cin >> opt;
if (opt == "INSERT") {
int posi, tot;
cin >> posi >> tot;
for (int i = 0; i < tot; i++)
cin >> w[i];
int l = get_k(posi + 1), r = get_k(posi + 2);
splay(l, 0);
splay(r, l);
int u = build(0, tot - 1, r);
lc(r) = u;
pushup(r);
pushup(l);
} else if (opt == "DELETE") {
int posi, tot;
cin >> posi >> tot;
int l = get_k(posi), r = get_k(posi + tot + 1);
splay(l, 0);
splay(r, l);
rec(lc(r));
lc(r) = 0;
pushup(r);
pushup(l);
} else if (opt == "MAKE-SAME") {
int posi, tot, c;
cin >> posi >> tot >> c;
int l = get_k(posi), r = get_k(posi + tot + 1);
splay(l, 0);
splay(r, l);
tr[lc(r)].same = 1;
tr[lc(r)].v = c;
tr[lc(r)].sum = tr[lc(r)].siz * c;
if (c > 0)
tr[lc(r)].ms = tr[lc(r)].ls = tr[lc(r)].rs = tr[lc(r)].sum;
else
tr[lc(r)].ms = c, tr[lc(r)].rs = tr[lc(r)].ls = 0;
pushup(r);
pushup(l);
} else if (opt == "REVERSE") {
int posi, tot;
cin >> posi >> tot;
int l = get_k(posi), r = get_k(posi + tot + 1);
splay(l, 0);
splay(r, l);
tr[lc(r)].rev ^= 1;
swap(lc(lc(r)), rc(lc(r)));
swap(tr[lc(r)].ls, tr[lc(r)].rs);
pushup(r);
pushup(l);
} else if (opt == "GET-SUM") {
int posi, tot;
cin >> posi >> tot;
int l = get_k(posi), r = get_k(posi + tot + 1);
splay(l, 0);
splay(r, l);
cout << tr[lc(r)].sum << "\n";
} else
cout << tr[rt].ms << "\n";
}
return 0;
}