1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| ll sum[MAXN << 2], a[MAXN], lazy[MAXN << 2];
inline void pushup(int x) { sum[x] = sum[x << 1] + sum[x << 1 | 1]; }
inline void build(int l, int r, int x) { if (l == r) { sum[x] = a[l]; return; } int mid = l + r >> 1; build(l, mid, x << 1); build(mid + 1, r, x << 1 | 1); pushup(x); }
inline void pushdown(int l, int r, int x) { if (lazy[x]) { int mid = l + r >> 1; lazy[x << 1] += lazy[x]; sum[x << 1] += (mid - l + 1) * lazy[x]; lazy[x << 1 | 1] += lazy[x]; sum[x << 1 | 1] += (r - mid) * lazy[x]; lazy[x] = 0; } }
inline void update(int l, int r, int x, int ql, int qr, ll val) { if (l >= ql && r <= qr) { lazy[x] += val; sum[x] += val * (r - l + 1); return; } pushdown(l, r, x); int mid = l + r >> 1; if (ql <= mid) update(l, mid, x << 1, ql, qr, val); if (qr > mid) update(mid + 1, r, x << 1 | 1, ql, qr, val); pushup(x); }
inline ll query(int l, int r, int x, int ql, int qr) { int mid = l + r >> 1; if (l >= ql && r <= qr) { return sum[x]; } pushdown(l, r, x); ll res = 0; if (ql <= mid) res += query(l, mid, x << 1, ql, qr); if (qr > mid) res += query(mid + 1, r, x << 1 | 1, ql, qr); return res; }
|