照着别人的线段树点修改打代码,一直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 }