码迷,mamicode.com
首页 > 其他好文 > 详细

ZKW线段树

时间:2017-09-10 18:51:15      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:++   syn   while   c++   pre   col   name   amp   false   

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 long long tree[400005],flag[400005],deep;
 4 long long firstbit(int x){
 5 int ans=0;
 6     x++;
 7     while(x){
 8         ans++;
 9         x>>=1;
10     }
11     return 1<<ans;
12 }
13 long long query(int lc,int rc){
14 long long l=lc+deep-1,r=rc+deep+1,j=rc-lc+1,ans=0,lv=0,rv=0;
15     for(int p=1;l^r^1;p<<=1,l>>=1,r>>=1){
16         ans+=flag[l]*lv;ans+=flag[r]*rv;
17         if(~l&1){
18             ans+=tree[l^1];lv+=p;
19         }
20         if( r&1){
21             ans+=tree[r^1];rv+=p;
22         }
23     }
24     ans+=flag[l]*lv;ans+=flag[r]*rv;
25     for(l>>=1;l;l>>=1)
26         ans+=flag[l]*j;
27     return ans;
28 }
29 void update(int w,int v){
30     for(tree[w+=deep]+=v,w>>=1;w;w>>=1)
31         tree[w]+=v;
32 }
33 void update(int lc,int rc,int v){
34 int l=lc+deep-1,r=rc+deep+1,val=v*(rc-lc+1),lv=0,rv=0;
35     for(int p=v;l^r^1;p<<=1,l>>=1,r>>=1){
36         tree[l]+=lv;tree[r]+=rv;
37         if(~l&1){
38             flag[l^1]+=v;tree[l^1]+=p;lv+=p;
39         }
40         if( r&1){
41             flag[r^1]+=v;tree[r^1]+=p;rv+=p;
42         }
43     }
44     tree[l]+=lv;tree[r]+=rv;
45     for(l>>=1;l;l>>=1)
46         tree[l]+=val;
47 }
48 int main(){
49 int n,flag,k;
50     ios::sync_with_stdio(false);
51     cin>>n>>k;
52     deep=firstbit(n);
53     for(int i=1;i<=n;i++)
54         cin>>tree[deep+i];
55     for(int i=deep-1;i;i--)
56         tree[i]=tree[i<<1]+tree[i<<1|1];
57     while(k){
58         k--;
59         cin>>flag;
60         if(flag==1){
61             int a,b,c;
62             cin>>a>>b>>c;
63             update(a,b,c);
64         }
65         else if(flag==2){
66             int a,b;
67             cin>>a>>b;
68             cout<<query(a,b)<<endl;
69         }
70         else {
71             int a,b;
72             cin>>a>>b;
73             update(a,b);
74         }    
75     }
76     return 0;
77 }

 

ZKW线段树

标签:++   syn   while   c++   pre   col   name   amp   false   

原文地址:http://www.cnblogs.com/HC-LittleJian/p/7501596.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!