1 struct node
2 {
3 int l,r,sum;
4 };
5 node no[500000];
6 //存放每个点的值
7 int number[50000];
8 //存放每个点对应的节点
9 int pa[500000];
10 void build(int k,int l,int r)
11 {
12 no[k].l=l;
13 no[k].r=r;
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 }