hdu1166

照着别人的线段树点修改打代码,一直runtime error到死,发现是那个最大值少了1个0

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 50005
 4 int sum[MAXN*10];
 5 
 6 void build(int l,int r,int p)
 7 {
 8     if(l==r)
 9     {
10         scanf("%d",&sum[p]);
11         return ;
12     }
13     build(l,(l+r)/2,p*2);
14     build((l+r)/2+1,r,p*2+1);
15     sum[p]=sum[p*2]+sum[p*2+1];
16 }
17 
18 int query(int a,int b,int L,int R,int p)
19 {//printf("L:%d R:%d p:%d\n",L,R,p);
20     int m=(L+R)/2,s=0;
21     if(L==R)
22         return sum[p];
23     if(a<=L&&R<=b)
24     {
25    // printf("sum[%d]:%d\n",p,sum[p]);
26         return sum[p];
27     }
28 
29     if(a<=m)
30         s+=query(a,b,L,m,p*2);
31     if(m<b)
32         s+=query(a,b,m+1,R,p*2+1);
33     return s;
34 }
35 
36 void update(int a,int b,int l,int r,int p)
37 {
38     int m=(l+r)/2;
39     if(l==r)
40     {
41         sum[p]+=b;
42         return ;
43     }
44     if(a<=m)
45         update(a,b,l,m,p*2);
46     else
47         update(a,b,m+1,r,p*2+1);
48     sum[p]=sum[p*2]+sum[p*2+1];
49 }
50 
51 int main()
52 {
53     int t,n;
54     scanf("%d",&t);
55     for(int k=1;k<=t;k++)
56     {
57         scanf("%d",&n);
58         build(1,n,1);
59         printf("Case %d:\n",k);
60         //for(int i=1;i<=n*2;i++)
61           //  printf("%d ",sum[i]);printf("\n");
62         char str[20];
63         while(~scanf("%s",str))
64         {
65             if(str[0]=='E')
66                 break;
67             int a,b;
68             scanf("%d%d",&a,&b);
69             if(strcmp(str,"Query")==0)
70                 printf("%d\n",query(a,b,1,n,1));
71             else if(strcmp(str,"Add")==0)
72                 update(a,b,1,n,1);
73             else
74                 update(a,-b,1,n,1);
75         }
76     }
77     return 0;
78 }

 

posted @ 2013-05-06 15:24  zerojetlag  阅读(158)  评论(0编辑  收藏  举报