hdu 1166 敌兵布阵

线段树基础题:

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 200000+100
 4 
 5 int T, N, D, tree[MAXN], num;
 6 char s[10];
 7 
 8 void updata(int cur, int j)
 9 {
10     for(int i = D+cur; i^1; i >>= 1)
11     tree[i] += j;
12 }
13 
14 int query(int x, int y)
15 {
16     int i = D+x-1, j = D+y+1,ans = 0;
17     for(; i^j^1; i >>= 1, j>>=1)
18     {
19         if(~i&1)
20             ans += tree[i^1];
21         if(j&1)
22             ans += tree[j^1];
23     }
24     return ans;
25 }
26 
27 int main()
28 {
29     while(~scanf("%d",&T))
30     {
31         num = 1;
32         while(T --)
33         {
34             printf("Case %d:\n",num++);
35             scanf("%d",&N);
36             if(N == 0) break;
37             memset(tree, 0, sizeof(tree));
38             for(D = 1; D <= N + 2; D <<= 1);
39             for(int i = 1; i <= N; i ++)
40                 scanf("%d",&tree[D+i]);
41             for(int i = D-1; i > 0; i --)
42             {
43                 tree[i] = tree[i<<1] + tree[i<<1|1];
44             }
45             for(;;)
46             {
47                 scanf("%s",s);
48                 int a, b;
49                 if(s[0] == 'E') break;
50                 if(s[0] == 'A')
51                 {
52                     scanf("%d%d",&a,&b);
53                     updata(a,b);
54                 }
55                 if(s[0] == 'S')
56                 {
57                     scanf("%d%d",&a,&b);
58                     updata(a,-b);
59                 }
60                 if(s[0] == 'Q')
61                 {
62                     scanf("%d%d",&a, &b);
63                     printf("%d\n",query(a,b));
64                 }
65             }
66         }
67     }
68     return 0;
69 }
posted on 2012-08-20 17:14  BFP  阅读(148)  评论(0编辑  收藏  举报