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 */

 

posted @ 2016-07-23 11:03  rpSebastian  阅读(126)  评论(0)    收藏  举报