树状数组 求区间和

 1 #include <stdio.h>
2 #include <string.h>
3 int N,a[60000];
4 int lowbit(int x)
5 {
6
7 return x&(-x);
8 }
9 void add(int i,int x)
10 {
11 while(i<=N)
12 {
13 a[i]+=x;
14 i+=lowbit(i);
15 }
16 }
17 int sum(int i)
18 {
19 int sum=0;
20 while(i)
21 {
22 sum+=a[i];
23 i-=lowbit(i);
24 }
25 return sum;
26 }
27
28 int main( )
29 {
30 int M,i,j,k,p,flag,t,l=0;
31 char ch[20];
32 scanf("%d",&M);
33 while(M--)
34 {
35 scanf("%d",&N);
36 memset(a,0,sizeof(a));
37 //for(i=0;i<=N;i++)
38 //a[i]=0;
39 for(i=1;i<=N; i++ )
40 {
41 scanf("%d",&t);
42 add(i,t);
43 }
44 flag=1;
45 l++;
46 while( 1 )
47 {
48 int a1,b;
49 scanf("%s",ch);
50 if(ch[0]=='E')
51 break;
52 scanf("%d%d",&a1,&b);
53 if(ch[0]=='A')
54 {
55 add(a1,b);
56 }
57 else if(ch[0]=='Q')
58 {
59 if(flag)
60 printf("Case %d:\n",l),flag=0;
61 printf("%d\n",sum(b)-sum(a1-1));
62
63 }
64 else if(ch[0]=='S')
65 {
66 add(a1,-b);
67 }
68 }
69 }
70
71 return 0;
72
73
74 }

posted on 2011-08-15 19:27  more think, more gains  阅读(232)  评论(0编辑  收藏  举报

导航