struct Node{
int val, tag; Node *ls, *rs;
Node() {}
Node(int val, int tag, Node *ls, Node *rs) : val(val), tag(tag), ls(ls), rs(rs) {}
}*null, *pl[N << 2], tr[N << 2], **ptr = pl, *root;
#define newNode(a, b, c, d) (&(**ptr++ = Node(a, b, c, d)))
inline void init() {for (reg int i = 0; i < N << 2; ++i) pl[i] = &tr[i]; null = newNode(0, 0, 0, 0); root = null;}
inline void pushup(Node *rt) {rt -> val = max(rt -> ls -> val, rt -> rs -> val);}
inline void pushdown(Node *rt) {
rt -> tag && (
rt -> ls != null && (rt -> ls -> tag += rt -> tag, rt -> ls -> val += rt -> tag),
rt -> rs != null && (rt -> rs -> tag += rt -> tag, rt -> rs -> val += rt -> tag),
rt -> tag = 0
);
}
void modify(Node *&rt, int l, int r, int ll, int rr, int v) {
if(rt == null) rt = newNode(0, 0, null, null);
if(ll <= l && r <= rr) {
rt -> val += v, rt -> tag += v;
return;
}pushdown(rt);
int mid = l + r >> 1;
ll <= mid && (modify(rt -> ls, l, mid, ll, rr, v), 0),
mid < rr && ( modify(rt -> rs, mid + 1, r, ll, rr, v), 0);
pushup(rt);
}
RT。