func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MX = 1 << 19;   struct node {     long long left, right, cnt, tot, length;   };   struct segtree {     node t[MX * 2];     node merge(node& l, node& r) {       node ans;       ans.left = l.left + r.left + l.length * r.cnt;       ans.right = l.right + r.right + r.length * l.cnt;       ans.cnt = l.cnt + r.cnt;       ans.length = l.length + r.length;       ans.tot = l.tot + r.tot + l.right * r.cnt + r.left * l.cnt;       return ans;     }     void update(int wi, int su) {       wi += MX;       t[wi].cnt = su;       while (wi > 1) {         wi /= 2;         t[wi] = merge(t[wi * 2], t[wi * 2 + 1]);       }     }     long long read(int s, int e) {       s += MX, e += MX;       node l = {0}, r = {0};       while (s <= e) {         if (s & 1)           l = merge(l, t[s]), s = s / 2 + 1;         else           s /= 2;         if (e & 1)           e /= 2;         else           r = merge(t[e], r), e = e / 2 - 1;       }       return merge(l, r).tot;     }   } t;   struct query {     long long o, s, e;   } Q[MX];   map<long long, long long> point;   long long D[MX], tmp[MX];   int main() {     int N, T;     scanf( %d , &N);     for (int i = 1; i <= N; i++)       scanf( %lld , D + i), tmp[i] = D[i], point[D[i]] = 0;     scanf( %d , &T);     for (int i = 0; i < T; i++) scanf( %lld%lld%lld , &Q[i].o, &Q[i].s, &Q[i].e);     for (int i = 0; i < T; i++) {       if (Q[i].o == 2) continue;       tmp[Q[i].s] += Q[i].e;       point[tmp[Q[i].s]] = 0;     }     int wi = 0;     for (auto it = point.begin(), it2 = point.begin(); it != point.end();          ++it, wi++) {       it->second = wi * 2;       ++it2;       if (it2 != point.end())         t.t[MX + wi * 2 + 1].length = it2->first - it->first;     }     for (int i = MX - 1; i >= 1; i--) {       t.t[i].length = t.t[i * 2].length + t.t[i * 2 + 1].length;     }     for (int i = 1; i <= N; i++) {       t.update(point[D[i]], 1);     }     for (int i = 0; i < T; i++) {       if (Q[i].o == 1) {         t.update(point[D[Q[i].s]], 0);         D[Q[i].s] += Q[i].e;         t.update(point[D[Q[i].s]], 1);       } else {         auto l = point.lower_bound(Q[i].s), r = point.upper_bound(Q[i].e);         if (r == l)           printf( 0  n );         else           --r, printf( %lld n , t.read(l->second, r->second));       }     }     return 0;   }   