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 }

 

转载于:https://www.cnblogs.com/zerojetlag/archive/2013/05/06/3062862.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值