Codevs 1008 线段树练习1
Update 单点修改
Query 区间询问
1 /* 2 Problem ID : Codevs 1008 3 Problem : 线段树练习 4 */ 5 6 #include <cstdio> 7 8 #define lson l , m , rt << 1 9 #define rson m + 1 , r , rt << 1 | 1 10 const int maxn = 100008; 11 12 int sum[maxn << 2]; 13 int n,Q; 14 15 void Pushup(int rt){ 16 sum[rt] = sum[rt << 1] + sum[rt << 1 | 1]; 17 } 18 19 void Build(int l,int r,int rt){ 20 if (l==r) { 21 scanf("%d",&sum[rt]); 22 return; 23 } 24 int m = (l + r) >> 1; 25 Build(lson); 26 Build(rson); 27 Pushup(rt); 28 } 29 30 void Update(int p,int val,int l,int r,int rt){ 31 if (l == r) { 32 sum[rt] += val; 33 return; 34 } 35 int m = (l + r) >> 1; 36 if (p <= m) Update(p,val,lson); 37 if (m < p) Update(p,val,rson); 38 Pushup(rt); 39 } 40 41 int Query(int L,int R,int l,int r,int rt){ 42 if (L <= l && r <= R) { 43 return sum[rt]; 44 } 45 int m = (l + r) >> 1; 46 int res = 0; 47 if (L <= m) res+= Query(L,R,lson); 48 if (m < R) res+= Query(L,R,rson); 49 Pushup(rt); 50 return res; 51 } 52 53 int main(){ 54 scanf("%d",&n); 55 Build(1 , n , 1); 56 scanf("%d",&Q); 57 while (Q--) { 58 int x,y,z; 59 scanf("%d%d%d",&x,&y,&z); 60 if (x == 1) Update(y,z,1,n,1); 61 else printf("%d\n",Query(y,z,1,n,1)); 62 } 63 return 0; 64 } 65 66 /* 67 4 5 6 2 1 3 68 69 4 5 11 2 1 3 70 */

浙公网安备 33010602011771号