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 }

你可能感兴趣的:(HDU)