http://poj.org/problem?id=3468
#include<stdio.h> #include<string.h> #define maxn 100005 #define lc 2*o,l,m #define rc 2*o+1,m+1,r long long data[maxn]; long long sum[maxn*4]; long long lazy[maxn*4]; void pushup(int o){ sum[o]=sum[2*o]+sum[2*o+1]; } void pushdown(int o,int m){ if(lazy[o]){ lazy[2*o+1]+=lazy[o]; lazy[2*o]+=lazy[o]; sum[2*o]+=(m-m/2)*lazy[o]; sum[2*o+1]+=(m/2)*lazy[o]; lazy[o]=0; } } void build(int o,int l,int r){ lazy[o]=0; if(l==r){ scanf("%lld",&sum[o]); return ; } int m=(l+r)/2; build(2*o,l,m); build(2*o+1,m+1,r); pushup(o); } long long query(int L,int R,int o,int l,int r){ if(L<=l&&R>=r){ return sum[o]; } //pushdown(o,r-l+1); int m=(l+r)/2; long long ans=0; if(L<=m) ans+=query(L,R,lc); if(R>m) ans+=query(L,R,rc); return ans; } void update(int L,int R,int c,int o,int l,int r){ if(L<=l&&r<=R){ lazy[o]+=c; sum[o]+=(long long)c*(r-l+1); return ; } pushdown(o,r-l+1); int m=(l+r)/2; if(L<=m) update(L,R,c,lc); if(R>m) update(L,R,c,rc); pushup(o); } int main(){ int n,m; int i; scanf("%d%d",&n,&m); { build(1,1,n); while(m--) { getchar(); char ch; scanf("%c",&ch); if(ch=='Q') { int L,R; scanf("%d%d",&L,&R); printf("%lld\n",query(L,R,1,1,n)); } else { int L,R,c; scanf("%d%d%d",&L,&R,&c); update(L,R,c,1,1,n); } } } return 0; }