线段树模板
2017-08-12 08:13
363 查看
#include<iostream> #include<cstdio> #include<cstdlib> using namespace std; long long i,j,m,n,b[500001]; long long x,y,ord,k; struct data { long long aa,bb; long long val; long long sign; }a[2000001]; long long r() { long long aans=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9') { aans*=10; aans+=ch-'0'; ch=getchar(); } return aans*f; } void build(long long l,long long r,long long root) { if(l==r) { a[root].aa=a[root].bb=l; a[root].val=b[l]; return; } build(l,(l+r)/2,root*2); build(1+(l+r)/2,r,root*2+1); a[root].aa=l; a[root].bb=r; a[root].val=a[root*2].val+a[root*2+1].val; } void pushdown(long long root) { if(a[root].sign!=0) { a[root*2].val+=(a[root*2].bb-a[root*2].aa+1)*a[root].sign; a[root*2+1].val+=(a[root*2+1].bb-a[root*2+1].aa+1)*a[root].sign; a[root*2].sign+=a[root].sign; a[root*2+1].sign+=a[root].sign; a[root].sign=0; } } void update(long long root,long long ul,long long ur,long long add) { if(ul<=a[root].aa&&ur>=a[root].bb) { a[root].sign+=add; a[root].val+=(a[root].bb-a[root].aa+1)*add; return; } pushdown(root); long long mid=(a[root].aa+a[root].bb)/2; if(ul<=mid) update(root*2,ul,ur,add); if(ur>mid) update(root*2+1,ul,ur,add); a[root].val=a[root*2+1].val+a[root*2].val; } long long ask(long long nl,long long nr,long long root) { if(nl<=a[root].aa&&nr>=a[root].bb) return a[root].val; int mid=a[root].aa+a[root].bb; mid/=2; pushdown(root); long long ANS=0; if(nl<=mid) ANS+=ask(nl,nr,root*2); if(nr>mid) ANS+=ask(nl,nr,root*2+1); return ANS; } int main() { n=r(),m=r(); for(i=1;i<=n;i++) b[i]=r(); build(1,n,1); for(i=1;i<=m;i++) { ord=r(),x=r(),y=r(); if(ord==1) { update(1,x,x,y); } else { cout<<ask(x,y,1)<<endl; } } } /* 5 2 1 2 3 4 5 1 1 5 2 2 2 4 */
相关文章推荐
- 算法模板——线段树4(区间加+区间乘+区间覆盖值+区间求和)
- 线段树模板(区间最小值优化 版) (RMQ with Shifts)
- hdu1166(线段树模板)
- 线段树模板
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
- 线段树(简单模板)
- CRB and Queries(动态区间求第k小数模板题:线段树套平衡树)
- Luck and Love(二维线段树单点更新+区间查询+模板)
- hdu 4578 线段树模板
- 线段树模板
- [P3372][模板]线段树1
- 洛谷P3372 【模板】线段树 1
- 【模板】线段树 区间加+乘,区间求和 (模板题:洛谷P3373)
- HDU 1166 敌兵布阵(线段树模板)
- 玲珑杯1128--线段树模板
- 线段树模板(poj3468)
- 4000 HDU 4819 Mosaic(二维线段树区间查询+单点更新模板)
- A Simple Problem with Integers ----线段树的模板题
- 线段树模板-单点替换区间最值
- hdu1754(线段树单点替换&区间最值模板)