int n, m, s, t; int ans; int a[maxn]; structsegment_tree { structnode { int l, r; int num; }tr[maxn * 4]; voidbuild(int p, int l, int r) { tr[p] = {l, r, 0}; if(l == r) { tr[p].num = a[l]; return ; } int mid = (l + r)/2; build(p*2, l, mid); build(p*2+1, mid + 1, r); } //区间修改 voidmodify(int p, int l, int r, int k) { //完全在区间里面 if(tr[p].l >= l && tr[p].r <= r) { tr[p].num += k; return ; } int mid = (tr[p].l + tr[p].r)/2; if(l <= mid) modify(p*2, l, r, k); if(r > mid) modify(p*2+1, l, r, k); } //单点查询 voidquery(int p, int x) { ans += tr[p].num; if(tr[p].l == tr[p].r) return; int mid = (tr[p].l + tr[p].r)/2; if(x <= mid) query(p*2, x); elsequery(p*2+1, x); } }ST;
intmain() { cin >> n >> m; for (int i = 1; i <= n; ++ i) { scanf("%d", &a[i]); } ST.build(1, 1, n); for (int i = 1; i <= m; ++ i) { int c; scanf("%d", &c); if(c == 1) { int x, y, z; scanf("%d%d%d", &x, &y, &z); ST.modify(1, x, y, z); } else { ans = 0; int x; scanf("%d", &x); ST.query(1, x); printf("%d\n", ans); } } return0; } /* int main() { n = 100; for (int i = 1; i <= n; ++ i) { a[i] = i; } ST.build(1, 1, n); m = 10; for (int i = 1; i <= m; ++ i) { int l = 1, r = 100; ST.modify(1, l, r, 10000); ans = 0; // query(p, x), p = 1, x 为想要查询的点的下标 ST.query(1, 50); // 单点查询 下标为 50 的点的值,ans = 50 + 10000 * i cout << i << " " << ans << '\n'; ans = 0; ST.query(1, 100); // 单点查询 ans = 100 + 10000 * i cout << i << " " << ans << '\n'; } return 0; } */