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 abc" means adding c to each of Aa, Aa+1, ... , Ab. -10000 ≤ c ≤ 10000.
"Q ab" 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
这里讲得很详细:点击打开链接
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
const int MAXN=100000+10;
using namespace std;
typedef long long LL;
LL sum[MAXN];
LL c1[MAXN];
LL c2[MAXN];
int lowbit(int x)
{
return x&(-x);
}
void update(LL *c, int x, LL val)
{
while(x<=MAXN)
{
c[x]+=val;
x+=lowbit(x);
}
}
LL Sum(LL *c, int x)
{
LL res=0;
while(x>0)
{
res+=c[x];
x-=lowbit(x);
}
return res;
}
LL SUM(int x)
{
return sum[x]+(x+1)*Sum(c1,x)-Sum(c2,x);
}
int main()
{
//reopen("in.txt","r",stdin);
int n,m;
while(scanf("%d%d", &n,&m)==2)
{
memset(c1,0,sizeof(c1));
memset(c2,0,sizeof(c2));
int i,j,k;
for(i=1; i<=n; i++){
scanf("%d", &j);
sum[i]=sum[i-1]+j;
}
char ch[3];
while(m--)
{
scanf("%s", ch);
if(ch[0]=='Q'){
scanf("%d%d", &i,&j);
LL ans=SUM(j)-SUM(i-1);
printf("%I64d\n", ans);
}
else{
scanf("%d%d%d", &i,&j,&k);
update(c1,i,k);
update(c1,j+1,-k);
update(c2,i,i*k);
update(c2,j+1,-k*(j+1));
}
}
}
return 0;
}