hdu1166 敌兵布阵

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

线段树,单点更新

 1 #include <stdio.h>
 2 
 3 #define lson l, m, root<<1
 4 #define rson m+1, r, root<<1|1
 5 
 6 const int maxn = 55555;
 7 
 8 int sum[maxn<<2];
 9 
10 void push_up(int root)
11 {
12     sum[root] = sum[root<<1] + sum[root<<1|1];
13 }
14 
15 void build(int l, int r, int root)
16 {
17     int m = (l + r) >> 1;
18     if(l == r)
19     {
20         scanf("%d", sum+root);
21         return;
22     }
23     build(lson);
24     build(rson);
25     push_up(root);
26 }
27 
28 void update(int x, int add, int l, int r, int root)
29 {
30     int m = (l + r) >> 1;
31     if(l == r)
32     {
33         sum[root] += add;
34         return;
35     }
36     if(x <= m)
37     {
38         update(x, add, lson);
39     }
40     if(m+1 <= x)
41     {
42         update(x, add, rson);
43     }
44     push_up(root);
45 }
46 
47 int query(int L, int R, int l, int r, int root)
48 {
49     int m = (l + r) >> 1, result = 0;
50     if(L <= l && r <= R)
51     {
52         return sum[root];
53     }
54     if(L <= m)
55     {
56         result += query(L, R, lson);
57     }
58     if(m+1 <= R)
59     {
60         result += query(L, R, rson);
61     }
62     return result;
63 }
64 
65 int main()
66 {
67     int t, cases, n, a, b;
68     char s[8];
69     scanf("%d", &t);
70     for(cases=1; cases<=t; cases++)
71     {
72         printf("Case %d:\n", cases);
73         scanf("%d", &n);
74         build(1, n, 1);
75         while(scanf("%s", s), s[0]-'E')
76         {
77             scanf("%d%d", &a, &b);
78             if(s[0] == 'Q')
79             {
80                 printf("%d\n", query(a, b, 1, n, 1));
81                 continue;
82             }
83             if(s[0] == 'A')
84             {
85                 update(a, b, 1, n, 1);
86             }
87             else
88             {
89                 update(a, -b, 1, n, 1);
90             }
91         }
92     }
93     return 0;
94 }

 

posted @ 2013-02-01 21:56  Yuan1991  阅读(124)  评论(0编辑  收藏  举报