. 1 struct Node 2 { . 3 int L, R & lt, SUM; . 4 }; . 5 Node NO [ 500000 ]; . 6 // store value of each point . 7 int Number [ 50000 ]; . 8 // store each point corresponding to a node 9 int PA [ 500000 ]; 10 void Build ( int K, int L, int R & lt) . 11 { 12 is NO [K] .L = L; 13 is NO [K] .r = R & lt; 14 IF (L ==r) 15 { 16 no[k].sum=number[l]; 17 pa[l]=k; 18 return ; 19 } 20 int mid=(l+r)/2; 21 build(k*2,l,mid); 22 build(k*2+1,mid+1,r); 23 no[k].sum=no[k*2].sum+no[k*2+1].sum; 24 } 25 void change(int k,int x) 26 { 27 no[k].sum +=x; 28 if(k!=1) 29 { 30 change(k/2,x); 31 } 32 } 33 int query(int k,int l,int r) 34 { 35 if(no[k].l==l&&no[k].r==r) 36 { 37 return no[k].sum; 38 } 39 int mid = (no[k].l+no[k].r)/2; 40 if(r<=mid) 41 { 42 return query(k*2,l,r); 43 } 44 else if(l>mid) 45 { 46 return query(k*2+1,l,r); 47 } 48 else 49 { 50 return query(k*2,l,mid)+query(k*2+1,mid+1,r); 51 } 52 }