Description
You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, ... , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
"C a b c" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q a b" means querying the sum of Aa, Aa+1, ... , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4
Sample Output
4 55 9 15
Hint
#include<stdio.h> #include<string.h> #define maxn 100005 #define ll long long char str[10]; ll a[maxn]; struct node { ll l,r,sum,ans; }b[4*maxn]; void build(ll l,ll r,ll i) { ll mid; b[i].l=l; b[i].r=r; b[i].ans=0; if(b[i].l==b[i].r) { b[i].sum=a[l]; return; } mid=(l+r)/2; build(l,mid,2*i); build(mid+1,r,i*2+1); b[i].sum=b[i*2].sum+b[i*2+1].sum; } void pushdown(int i) { if(b[i].ans){ b[i*2].ans+=b[i].ans; b[i*2+1].ans+=b[i].ans; b[i*2].sum+=b[i].ans*(b[i*2].r-b[i*2].l+1); b[i*2+1].sum+=b[i].ans*(b[i*2+1].r-b[i*2+1].l+1); b[i].ans=0; } } void add(ll l,ll r,ll value,ll i) { ll mid; if(b[i].l==l && b[i].r==r) { b[i].ans=b[i].ans+value; b[i].sum+=(b[i].r-b[i].l+1)*value; return; } pushdown(i); b[i].sum+=(r-l+1)*value; //这一句写了,下面第二句就不用写了,是同一个意思 mid=(b[i].l+b[i].r)/2; if(l>mid) add(l,r,value,i*2+1); else if(r<=mid) add(l,r,value,i*2); else { add(l,mid,value,i*2); add(mid+1,r,value,i*2+1); } //b[i].sum=b[i*2].sum+b[i*2+1].sum; ---2 } ll question(ll l,ll r,ll i) { ll mid; if(b[i].l==l && b[i].r==r) { return b[i].sum; } pushdown(i); mid=(b[i].l+b[i].r)/2; if(l>mid) return question(l,r,i*2+1); else if(r<=mid) return question(l,r,i*2); else if(l<=mid && r>mid) return question(l,mid,i*2)+question(mid+1,r,i*2+1); } int main() { ll n,m,c,d,e,i,j; while(scanf("%lld%lld",&n,&m)!=EOF) { for(i=1;i<=n;i++) scanf("%lld",&a[i]); build(1,n,1); while(m--) { scanf("%s",str); if(str[0]=='Q') { scanf("%lld%lld",&c,&d); printf("%lld\n",question(c,d,1)); } else if(str[0]=='C') { scanf("%lld%lld%lld",&c,&d,&e); add(c,d,e,1); } } } return 0; }