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
The sums may exceed the range of 32-bit integers.
程序
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int a[100005];
long long b[2][100005],sum[100005];
long long ask(int k,int x){
long long ans=0;
for (;x;x-=x&-x)
ans+=b[k][x];
return ans;
}
void add(int k,int x,int y){
for (;x<=n;x+=x&-x)
b[k][x]+=y;
}
int main(){
cin>>n>>m;
for (int i=1;i<=n;i++){
cin>>a[i];
sum[i]=sum[i-1]+a[i];
}
while (m--){
char c[2];
int l,r,d;
scanf("%s%d%d",c,&l,&r);
if (c[0]=='C'){
cin>>d;
add(0,l,d);
add(0,r+1,-d);
add(1,l,l*d);
add(1,r+1,-(r+1)*d);
}
else{
long long ans=sum[r]+(r+1)*ask(0,r)-ask(1,r);
ans-=sum[l-1]+l*ask(0,l-1)-ask(1,l-1);
cout<<ans<<endl;
}
}
return 0;
}