poj_3468线段树成段更新求区间和
2014-05-20 14:21
232 查看
#include<iostream> #include<string.h> #include<cstdio> long long num[100010]; using namespace std; struct st { int l; int r; long long sum; long long a; } p[400100]; void build(int t,int l,int r) { p[t].l=l; p[t].r=r; if(l==r-1) { p[t].sum=num[l]; return; } int mid=(l+r)/2; build(t*2+1,mid,r); build(t*2,l,mid); p[t].sum=p[t*2].sum+p[t*2+1].sum; } void update(int t,int l,int r,int v) { if(p[t].l==l&&p[t].r==r) { p[t].a += v; p[t].sum += v*(r -l); return ; } if( p[t].a ) { p[2*t+1].a += p[t].a; p[2*t].a += p[t].a; p[2*t+1].sum += p[t].a*(p[2*t+1].r -p[2*t+1].l); p[2*t].sum += p[t].a*(p[2*t].r -p[2*t].l); p[t].a = 0; } int mid = (p[t].l+p[t].r)/2; if( l >= mid ) update(2*t+1,l,r,v); else if( r <= mid ) update(2*t,l,r,v); else { update(2*t,l,mid,v); update(2*t+1,mid,r,v); } p[t].sum = p[2*t].sum + p[2*t+1].sum; } long long query(int t,int l,int r) { if(p[t].l == l && p[t].r == r ) return p[t].sum; if( p[t].a ) { p[2*t+1].a += p[t].a; p[2*t].a += p[t].a; p[2*t+1].sum +=p[t].a*(p[2*t+1].r - p[2*t+1].l); p[2*t].sum += p[t].a*(p[2*t].r - p[2*t].l); p[t].a = 0; } int mid =(p[t].l+p[t].r)/2; if( l >= mid ) return query(2*t+1,l,r); else if( r <= mid ) return query(2*t,l,r); else return query(2*t,l,mid) + query(2*t+1,mid,r); } int main() { int n,q; while(scanf("%d%d",&n,&q)!=EOF) { for(int i=0; i<n; i++) scanf("%lld",&num[i]); memset(p,0,sizeof(p)); build(1,0,n+1); getchar(); for(int i=0; i<q; i++) { char c; scanf("%c",&c); if(c=='Q') { int x,y; scanf("%d%d",&x,&y); getchar(); printf("%lld\n",query(1,x-1,y)); } else if(c=='C') { int x,y,z; scanf("%d%d%d",&x,&y,&z); getchar(); update(1,x-1,y,z); } } } return 0; }
相关文章推荐
- POJ 3468 【线段树 成段更新 求区间和】.cpp
- poj 3468 A Simple Problem with Integers 【线段树成段更新 + 区间求和】
- POJ 3468 A Simple Problem with Integers (线段树,成段更新,区间求和)
- POJ 3468 【线段树区间更新-成段更新】
- POJ 3468 A Simple Problem with Integers(段更新的区间求和&Lazy思想&线段树)
- poj 3468 A Simple Problem with Integers(线段树|成段更新,区间查询)
- POJ 3468 线段树成段更新区间求和 + 延迟标记详解 A Simple Problem with Integers
- POJ - 3468 A Simple Problem with Integers(线段树成段更新,查询区间和)
- poj 3468 A Simple Problem with Integers(线段树)(第二部分 成段更新,区间求和)
- poj_3468线段树成段更新求区间和
- POJ 题目3468 A Simple Problem with Integers(线段树成段更新,区间求和)
- poj_3468线段树成段更新求区间和
- poj 3468 线段树 区间内的线段和(成段更新)
- POJ 3468 A Simple Problem with Integers 线段树成段更新+区间查询
- POJ 3468-A Simple Problem with Integers(线段树:成段更新,区间求和)
- POJ 3468 A Simple Problem with Integers 线段树区间更新 纯模板题
- 线段树(成段更新) POJ 3468 A Simple Problem with Integers
- [poj] 3468 A Simple Problem with Integers [线段树][区间加&求和][懒标记]
- POJ 3468 A Simple Problem with Integers(线段树成段更新)
- poj 3468 线段树区间更新,模板题