#include <vector>#include <queue>#include <stack>#include <set>#include <map>#include <algorithm>#include <iostream>#include <cstdio>#include <cstring>#define MAXN 100005#define LC(x) ((x) << 1)#define RC(x) ((x) << 1 | 1)#define Mid(x,y) (((x) + (y)) >> 1)#define Min(a,b) ((a) < (b) ? (a) : (b))#define Max(a,b) ((a) > (b) ? (a) : (b))long long int sum[MAXN<<2],dlt[MAXN<<2];int lft[MAXN<<2],rht[MAXN<<2];long long int init_v[MAXN+10];using namespace std;void pushdown(int rt){if(dlt[rt]){dlt[LC(rt)]+=dlt[rt];sum[LC(rt)]+=(rht[LC(rt)]-lft[LC(rt)]+1)*dlt[rt]; //width*heightdlt[RC(rt)]+=dlt[rt];sum[RC(rt)]+=(rht[RC(rt)]-lft[RC(rt)]+1)*dlt[rt];dlt[rt]=0;}}void pushup(int rt){sum[rt] = sum[LC(rt)] + sum[RC(rt)];}void update(int rt,int start,int end,long long int delta){if(start<=lft[rt]&&end>=rht[rt]){dlt[rt]+=delta;sum[rt] += (rht[rt]-lft[rt]+1)*delta;return;}pushdown(rt);// 顺便将之前未更新到儿子的信息pushdownif(start<=rht[LC(rt)]) update(LC(rt),start,end,delta); //要更新的区间和左儿子有交集(区间左界<=左儿子右界)if(end>=lft[RC(rt)]) update(RC(rt),start,end,delta); //要更新的区间和右儿子有交集pushup(rt);//返回时候更新当前节点}void build(int rt,int l,int r){lft[rt]=l;rht[rt]=r;dlt[rt]=0;if(l==r){sum[rt]=init_v[l];return;}else{build(LC(rt),l,Mid(l,r));build(RC(rt),Mid(l,r)+1,r);pushup(rt);return;}}long long int query(int rt,int start,int end){if(start>rht[rt]||end<lft[rt]) return 0;//如果当前节点在查询的范围内就直接返回if(start<=lft[rt]&&end>=rht[rt])return sum[rt];pushdown(rt);//顺便更新之前的标记// if(start>=lft[RC(rt)]) //区间只和右儿子有交集 区间左界大于等于右儿子左界// return query(RC(rt),start,end);// else// if(end<=rht[LC(rt)]) //区间只和左儿子有集交// return query(LC(rt),start,end);// else //左右儿子都有交集return query(LC(rt),start,end) + query(RC(rt),start,end);}int main(int argc, char *argv[]){int n,q,i,j,start,end;long long int delta;char ch[2];while(scanf("%d%d",&n,&q)!=EOF){for(i=1;i<=n;i++) scanf("%lld",init_v+i);build(1,1,n);while(q--){scanf("%s",ch);if(ch[0]==‘C‘){scanf("%d%d%lld",&start,&end,&delta);update(1,start,end,delta);}else{scanf("%d%d",&start,&end);printf("%lld\n",query(1,start,end));}}return 0;}}
原文:http://www.cnblogs.com/sober-reflection/p/6c9a73c89008dc456abec64956fee8a3.html