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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
   |  using ll = long long; const int N;
  ll a[N];
  struct TreeNode {     ll l, r;     ll sum;     ll add; } tr[N << 2];
  void pushup(int u) {     tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum; }
  void pushdown(int u) {     if (!tr[u].add)         return;     auto &root = tr[u],          &left = tr[u << 1],          &right = tr[u << 1 | 1];     left.add += root.add;     left.sum += (left.r - left.l + 1) * root.add;     right.add += root.add;     right.sum += (right.r - right.l + 1) * root.add;     root.add = 0; }
  void build(int u, int l, int r) {     if (l == r)     {         tr[u] = {l, r, a[l], 0};         return;     }     tr[u] = {l, r, 0, 0};     int mid = l + r >> 1;     build(u << 1, l, mid);     build(u << 1 | 1, mid + 1, r);     pushup(u); }
  void modify(int u, int l, int r, int x) {     if (l <= tr[u].l && tr[u].r <= r)     {         tr[u].sum += (tr[u].r - tr[u].l + 1) * x;         tr[u].add += x;         return;     }     pushdown(u);     int mid = tr[u].l + tr[u].r >> 1;     if (l <= mid)         modify(u << 1, l, r, x);     if (r > mid)         modify(u << 1 | 1, l, r, x);     pushup(u); }
  ll query(int u, int l, int r) {     if (l <= tr[u].l && tr[u].r <= r)         return tr[u].sum;     pushdown(u);     int mid = tr[u].l + tr[u].r >> 1;     ll res = 0;     if (l <= mid)         res += query(u << 1, l, r);     if (r > mid)         res += query(u << 1 | 1, l, r);     return res; }
 
  |