ZKW线段树
2018-06-17 21:57:08来源:未知 阅读 ()
#include <bits/stdc++.h> using namespace std; long long tree[400005],flag[400005],deep; long long firstbit(int x){ int ans=0; x++; while(x){ ans++; x>>=1; } return 1<<ans; } long long query(int lc,int rc){ long long l=lc+deep-1,r=rc+deep+1,j=rc-lc+1,ans=0,lv=0,rv=0; for(int p=1;l^r^1;p<<=1,l>>=1,r>>=1){ ans+=flag[l]*lv;ans+=flag[r]*rv; if(~l&1){ ans+=tree[l^1];lv+=p; } if( r&1){ ans+=tree[r^1];rv+=p; } } ans+=flag[l]*lv;ans+=flag[r]*rv; for(l>>=1;l;l>>=1) ans+=flag[l]*j; return ans; } void update(int w,int v){ for(tree[w+=deep]+=v,w>>=1;w;w>>=1) tree[w]+=v; } void update(int lc,int rc,int v){ int l=lc+deep-1,r=rc+deep+1,val=v*(rc-lc+1),lv=0,rv=0; for(int p=v;l^r^1;p<<=1,l>>=1,r>>=1){ tree[l]+=lv;tree[r]+=rv; if(~l&1){ flag[l^1]+=v;tree[l^1]+=p;lv+=p; } if( r&1){ flag[r^1]+=v;tree[r^1]+=p;rv+=p; } } tree[l]+=lv;tree[r]+=rv; for(l>>=1;l;l>>=1) tree[l]+=val; } int main(){ int n,flag,k; ios::sync_with_stdio(false); cin>>n>>k; deep=firstbit(n); for(int i=1;i<=n;i++) cin>>tree[deep+i]; for(int i=deep-1;i;i--) tree[i]=tree[i<<1]+tree[i<<1|1]; while(k){ k--; cin>>flag; if(flag==1){ int a,b,c; cin>>a>>b>>c; update(a,b,c); } else if(flag==2){ int a,b; cin>>a>>b; cout<<query(a,b)<<endl; } else { int a,b; cin>>a>>b; update(a,b); } } return 0; }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 排序汇总 2020-05-05
- 【数据结构】树套树——线段树套平衡树 2020-04-18
- 单链表 2020-03-31
- 顺序算法 2020-03-31
- 线段树学习资料 2020-03-19
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash