线段树学习笔记

2019-11-26 16:01:03来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

 1 #include<iostream>
 2 using namespace std;
 3 struct tree{
 4   int l,r,sum;
 5 }t[1000001];
 6 int a[1000001],n,p,x,y,m;
 7 inline void build(int root,int left,int right)
 8 {
 9   t[root].l=left;t[root].r=right;
10   if(left==right){t[root].sum=a[left];return;}
11   int child(root<<1),mid((left+right)>>1);
12   build(child,left,mid);build(child+1,mid+1,right);
13   t[root].sum=t[child].sum+t[child+1].sum;
14 }
15 inline int search(int root,int left,int right)
16 {
17   if((t[root].l>=left)&&(t[root].r<=right))
18     return t[root].sum;
19   if((t[root].r<left)||(t[root].l>right))
20     return 0;
21   int local_sum(0),child(root<<1);
22   if(t[child].r>=left)
23     local_sum+=search(child,left,right);
24   if(t[child+1].l<=right)
25     local_sum+=search(child+1,left,right);
26   return local_sum;
27 }
28 inline void add(int root,int goal,int plus)
29 {
30   if(t[root].l==t[root].r)
31   {
32     t[root].sum+=plus;
33     return;
34   }
35   int child(root<<1);
36   if(goal<=t[child].r)
37     add(child,goal,plus);
38   else
39     add(child+1,goal,plus);
40   t[root].sum=t[child].sum+t[child+1].sum;
41 }
42 int main()
43 {
44   cin>>n>>m;
45   for(int i=1;i<=n;i++)
46     cin>>a[i];
47   build(1,1,n);
48   for(int i=0;i<m;i++)
49   {
50     cin>>p>>x>>y;
51     if(p==1)
52       add(1,x,y);
53     else
54     cout<<search(1,x,y)<<endl;
55   }
56   return 0;
57 }

原文链接:https://www.cnblogs.com/zythonc/p/11937452.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:stl标准库 iterator_traits

下一篇:螺旋折线-C++