A Simple Problem with Integers
http://poj.org/problem?id=3468
#include <stdio.h> struct node { int l,r; __int64 sum; __int64 add; }tree[100000*3]; void build(int left,int right,int root) { int mid=(left+right)/2; if(left==right) { tree[root].l=left; tree[root].r=right; tree[root].add=0; scanf("%I64d",&tree[root].sum); return ; } tree[root].l=left; tree[root].r=right; tree[root].add=0; build(left,mid,2*root); build(mid+1,right,2*root+1); tree[root].sum=tree[2*root].sum+tree[2*root+1].sum; } void modify(int left,int right,__int64 add,int root) { int mid=(tree[root].l+tree[root].r)/2; if(tree[root].l==left&&tree[root].r==right) { tree[root].sum+=add*(tree[root].r-tree[root].l+1); tree[root].add+=add; return; } if(tree[root].add) { tree[2*root].add+=tree[root].add; tree[2*root+1].add+=tree[root].add; tree[2*root].sum+=tree[root].add*(tree[2*root].r-tree[2*root].l+1); tree[2*root+1].sum+=tree[root].add*(tree[2*root+1].r-tree[2*root+1].l+1); tree[root].add=0; } if(right<=mid) modify(left,right,add,2*root); else if(left>=mid+1) modify(left,right,add,2*root+1); else { modify(left,mid,add,2*root); modify(mid+1,right,add,2*root+1); } tree[root].sum=tree[2*root].sum+tree[2*root+1].sum; } __int64 search(int left,int right,int root) { int mid=(tree[root].l+tree[root].r)/2; __int64 sum; if(left==tree[root].l&&right==tree[root].r) return sum=tree[root].sum; if(tree[root].add) { tree[2*root].add+=tree[root].add; tree[2*root+1].add+=tree[root].add; tree[2*root].sum+=tree[root].add*(tree[2*root].r-tree[2*root].l+1); tree[2*root+1].sum+=tree[root].add*(tree[2*root+1].r-tree[2*root+1].l+1); tree[root].add=0; } if(right<=mid) return sum=search(left,right,2*root); else if(left>=mid+1) return sum=search(left,right,2*root+1); else return sum=search(left,mid,2*root)+search(mid+1,right,2*root+1); } int main() { int n,q,i; char str[2]; int a,b; __int64 c; scanf("%d%d",&n,&q); build(1,n,1); for(i=1;i<=q;i++) { scanf("%s%d%d",str,&a,&b); if(str[0]=='Q') { printf("%I64d\n",search(a,b,1)); } else { scanf("%I64d",&c); modify(a,b,c,1); } } return 0; }