线段树算法(未完成)

 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 }

猜你喜欢

转载自www.cnblogs.com/mzchuan/p/11748480.html