HDU 1166 敌兵布阵 线段树,单点更新

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

代码

View Code
 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 50000*4+5
 4 struct node {
 5     int l,r,val;
 6 }tr[maxn];
 7 void pushup(int rt)
 8 {
 9     tr[rt].val = tr[rt*2].val+tr[rt*2+1].val;
10     return;
11 }
12 void build(int l,int r,int rt)
13 {
14     tr[rt].l = l;
15     tr[rt].r = r;
16     if(r == l)
17     {
18         scanf("%d",&tr[rt].val);
19         return;
20     }
21     int m;
22     m = (r+l)/2;
23     build(l,m,rt*2);
24     build(m+1,r,rt*2+1);
25     pushup(rt);
26 }
27 void update(int target,int val,int rt)
28 {
29     int m;
30     if(tr[rt].l == tr[rt].r){
31         tr[rt].val += val;
32         return;
33     }
34     m = (tr[rt].l+tr[rt].r)/2;
35     if(target > m)
36     update(target,val,rt*2+1);
37     else
38     update(target,val,rt*2);
39     pushup(rt);
40     return;
41 }
42 int ask(int l,int r,int rt)
43 {
44     if(tr[rt].l == l&& r == tr[rt].r)
45     return tr[rt].val;
46     int m;
47     m = (tr[rt].l+tr[rt].r)/2;
48     if(l > m)
49     return ask(l,r,rt*2+1);
50     else if(r <= m)
51     return ask(l,r,rt*2);
52     else
53     return ask(l,m,rt*2)+ask(m+1,r,rt*2+1);
54 }
55 int main()
56 {
57     int t;
58     scanf("%d",&t);
59     int cas = 0;
60     while(t--)
61     {
62         cas++;
63         printf("Case %d:\n",cas);
64         int n,i,j,k;
65         char order[20];
66         scanf("%d",&n);
67         build(1,n,1);
68         while(~scanf("%s",order))
69         {
70             if(order[0] == 'E')
71             break;
72             scanf("%d %d",&i,&j);
73             if(order[0] == 'A')
74             update(i,j,1);
75             else if(order[0] == 'S')
76             update(i,-j,1);
77             else
78             printf("%d\n",ask(i,j,1));
79         }
80     }
81 }
posted @ 2012-08-10 21:53  某某。  阅读(151)  评论(0编辑  收藏  举报