这种题目完全不会debug…
对着y总代码调通后突然有种进入贤者模式的感觉…
#include<iostream>
#include<cstring>
using namespace std;
const int N = 500010, INF = 0x3f3f3f3f;
int n, m;
struct Node{
int s[2], p;
int ts, ls, rs, ms;
int rev, same;
int v, size;
void init(int v_, int p_)
{
s[0] = s[1] = 0;
v = v_, p = p_;
rev = same = 0;
ts = ms = v, size = 1;
ls = rs = max(0, v);
}
} tr[N];
int root, nodes[N], tt(0);
int a[N];
void pushup(int x)
{
auto &root = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
root.size = l.size + r.size + 1;
root.ts = l.ts + r.ts + root.v;
root.ls = max(l.ls, l.ts + root.v + r.ls);
root.rs = max(r.rs, r.ts + root.v + l.rs);
root.ms = max(r.ms, max(l.ms, r.ls + l.rs + root.v));
}
void pushdown(int x)
{
auto &root = tr[x], &l = tr[tr[x].s[0]], &r = tr[tr[x].s[1]];
if(root.same)
{
root.same = root.rev = 0;
if(root.s[0]) l.v = root.v, l.same = 1, l.ts = l.size * l.v;
if(root.s[1]) r.v = root.v, r.same = 1, r.ts = r.size * r.v;
if(root.v > 0)
{
if(root.s[0]) l.ms = l.rs = l.ls = l.ts;
if(root.s[1]) r.ms = r.rs = r.ls = r.ts;
}
else
{
if(root.s[0]) l.ms = l.v, l.ls = l.rs = 0;
if(root.s[1]) r.ms = r.v, r.ls = r.rs = 0;
}
}
else if(root.rev)
{
root.rev = 0, l.rev ^= 1, r.rev ^= 1;
if(root.s[0]) swap(l.rs, l.ls), swap(l.s[0], l.s[1]);
if(root.s[1]) swap(r.ls, r.rs), swap(r.s[0], r.s[1]);
}
}
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[z].s[1] == y) ^ (tr[y].s[1] == x)) rotate(x);
else rotate(y);
rotate(x);
}
if(!k) root = x;
}
int get_k(int k)
{
int u = root;
while(true)
{
pushdown(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 u;
else k -= tr[tr[u].s[0]].size + 1, u = tr[u].s[1];
}
return -1;
}
void del(int u)
{
if(tr[u].s[0]) del(tr[u].s[0]);
if(tr[u].s[1]) del(tr[u].s[1]);
nodes[++tt] = u;
}
int build(int l, int r, int p)
{
int mid = l + r >> 1;
int u = nodes[tt--];
tr[u].init(a[mid], p);
if(l < mid) tr[u].s[0] = build(l, mid - 1, u);
if(r > mid) tr[u].s[1] = build(mid + 1, r, u);
pushup(u);
return u;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i < N; ++i) nodes[++tt] = i;
tr[0].ms = a[0] = a[n + 1] = -INF;
for(int i = 1; i <= n; ++i) scanf("%d", a + i);
root = build(0, n + 1, 0);
char op[20];
while(m --)
{
scanf("%s", op);
if(!strcmp(op, "INSERT"))
{
int pos, cnt;
scanf("%d%d", &pos, &cnt);
for(int i = 1; i <= cnt; ++i) scanf("%d", a + i);
int l = get_k(pos + 1), r = get_k(pos + 2);
splay(l, 0), splay(r, l);
int u = build(1, cnt, r);
tr[r].s[0] = u;
pushup(r), pushup(l);
}
else if(!strcmp(op, "DELETE"))
{
int pos, cnt;
scanf("%d%d", &pos, &cnt);
int l = get_k(pos), r = get_k(pos + cnt + 1);
splay(l, 0), splay(r, l);
del(tr[r].s[0]);
tr[r].s[0] = 0;
pushup(r), pushup(l);
}
else if(!strcmp(op, "MAKE-SAME"))
{
int pos, cnt, c;
scanf("%d%d%d", &pos, &cnt, &c);
int l = get_k(pos), r = get_k(pos + cnt + 1);
splay(l, 0), splay(r, l);
auto &son = tr[tr[r].s[0]];
son.same = 1, son.rev = 0, son.v = c, son.ts = c * son.size;
if(c > 0) son.ms = son.ls = son.rs = son.ts;
else son.ms = c, son.ls = son.rs = 0;
pushup(r), pushup(l);
}
else if(!strcmp(op, "REVERSE"))
{
int pos, cnt;
scanf("%d%d", &pos, &cnt);
int l = get_k(pos), r = get_k(pos + cnt + 1);
splay(l, 0), splay(r, l);
auto& son = tr[tr[r].s[0]];
son.rev ^= 1;
swap(son.rs, son.ls);
swap(son.s[0], son.s[1]);
pushup(r), pushup(l);
}
else if(!strcmp(op, "GET-SUM"))
{
int pos, cnt;
scanf("%d%d", &pos, &cnt);
int l = get_k(pos), r = get_k(pos + cnt + 1);
splay(l, 0), splay(r, l);
printf("%d\n", tr[tr[r].s[0]].ts);
}
else printf("%d\n", tr[root].ms);
}
return 0;
}
贤者模式???