hdu4027
又是一个runtime error的代码,求高手指教
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 long long a[100005]; 6 struct node 7 { 8 int left; 9 int right; 10 long long sum; 11 int flag; 12 } b[100005*2]; 13 14 15 void build(int left , int right , int i)//为left,right ,sum赋值 16 { 17 int mid; 18 b[i].left=left; 19 b[i].right=right; 20 b[i].flag=0; 21 if(left==right) 22 { 23 b[i].sum=a[left]; 24 return ; 25 } 26 27 mid=(left+right)/2; 28 build(left,mid,2*i); 29 build(mid+1,right,2*i+1); 30 b[i].sum=b[2*i].sum + b[2*i+1].sum; 31 32 } 33 34 void Update(int left , int right ,int i)//注意是区间更新还是确定的点更新 35 { 36 if(b[i].flag==1) 37 { 38 return ; 39 } 40 if(b[i].left==b[i].right ) 41 { 42 b[i].sum=sqrt(b[i].sum); 43 if(b[i].sum==1) b[i].flag=1; 44 return ; 45 } 46 47 int mid =(b[i].left+b[i].right)/2; 48 if(right<=mid) Update(left,right,2*i); 49 if(left>mid) Update(left ,right,2*i+1); 50 else { Update(left,mid,2*i); Update(mid+1 ,right,2*i+1);};//区间更新会有这句话,确定点更新不会有这句话 51 b[i].sum=b[i*2].sum+b[2*i+1].sum; 52 } 53 54 55 56 long long Query(int left, int right,int i) 57 { 58 int mid; 59 if(b[i].left==left && b[i].right ==right) return b[i].sum; 60 mid=(b[i].left+b[i].right)/2; 61 if(right<=mid) return Query(left,right,2*i); 62 if (left>mid ) return Query(left,right,2*i+1); 63 if(left<=mid && mid<right) 64 return Query(left,mid,2*i) + Query(mid+1,right,2*i+1); 65 } 66 67 68 69 int main() 70 { 71 int n; 72 int m; 73 int t,x,y; 74 int k=1; 75 int i; 76 while(1) 77 { 78 scanf("%d",&n); 79 for(i=1;i<=n;i++) 80 { 81 scanf("%I64d",&a[i]); 82 } 83 build(1,n,1); 84 scanf("%d",&m); 85 printf("Case #%d:\n",k++); 86 87 for(i=0;i<m;i++) 88 { 89 scanf("%d%d%d",&t,&x,&y); 90 if(t==0) 91 { 92 Update(x,y,1); 93 } 94 if(t==1) 95 { 96 printf("%I64d\n",Query(x,y,1)); 97 } 98 99 } 100 } 101 return 0; 102 }