樹狀陣列——區間修改,點查詢
阿新 • • 發佈:2019-01-27
板子題
#include <bits/stdc++.h> #define sf1(a) scanf("%d",&a) #define sf2(a,b) scanf("%d%d",&a,&b) #define sf3(a,b,c) scanf("%d%d%d",&a,&b,&c) using namespace std; typedef long long ll; const int N = 1e5 + 5; int a[N], c[N]; int n, q; int lowbit(int k) { return k & -k; } void add(int p, int v) { while(p <= n) { c[p] += v; p += lowbit(p); } } int sum(int p) { int r = 0; while(p > 0) { r += c[p]; p -= lowbit(p); } return r; } int main() { sf1(n); for(int i = 1;i <= n;i ++) { sf1(a[i]); add(i, a[i] - a[i - 1]); } sf1(q); int h, l, r, v; while(q --) { sf1(h); if(h == 1) { sf3(l,r,v); add(l, v); add(r + 1, -v); } else { sf1(l); cout << sum(l) << '\n'; } } return 0; }