线段树算法(未完成)

巧了我就是萌 提交于 2019-12-04 02:12:16
 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 }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!