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 77 78 79 80 81 82 83 84 85 86 87
   | #include <iostream> #include <cstdio>
  int n, m; int tot, root; struct Tree {     int ls, rs;     int dat; } tr[10000007];
  int AddNode() {     tot ++;
      tr[tot].ls = tr[tot].rs = tr[tot].dat = 0;
      return tot; }
  void Modify(int rt, int l, int r, int p, int v) {     if(l == r)     {         tr[rt].dat += v;
          return;     }
      int mid = (l + r) >> 1;
      if(p <= mid)     {         if(! tr[rt].ls) tr[rt].ls = AddNode();
          Modify(tr[rt].ls, l, mid, p, v);     }     else     {         if(! tr[rt].rs) tr[rt].rs = AddNode();
          Modify(tr[rt].rs, mid + 1, r, p, v);     }
      tr[rt].dat = tr[tr[rt].ls].dat + tr[tr[rt].rs].dat; }
  int Query(int rt, int l, int r, int ql, int qr) {     if(l >= ql && r <= qr) return tr[rt].dat;
      int mid = (l + r) >> 1;
      int res = 0;     if(ql <= mid)         res += tr[rt].ls ? Query(tr[rt].ls, l, mid, ql, qr) : 0;     if(qr > mid)         res += tr[rt].rs ? Query(tr[rt].rs, mid + 1, r, ql, qr) : 0;
      return res; }
  int main() {     root = AddNode();
      scanf("%d%d", &n, &m);     for(int i = 1; i <= n; i ++)     {         int a;         scanf("%d", &a);
          Modify(root, 1, n, i, a);     }     for(int i = 1; i <= m; i ++)     {         int op, x, y;         scanf("%d%d%d", &op, &x, &y);
          if(op == 1)             Modify(root, 1, n, x, y);         else             printf("%d\n", Query(root, 1, n, x, y));     }
      return 0; }
   |