时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
You have
N
integers,
A
1
,
A
2
, ... ,
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.
输入描述:
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.
输出描述:
You need to answer all Q commands in order. One answer in a line.
#include<cstdio>
#include<cstring>
using namespace std;
int n,s,m;
char str[5];
long long c1[200010],c2[200010];
int lowbit(int x)
{
return x&-x;
}
void add(long long c[],int x,int k)
{
while(x<=n)
{
c[x]+=k;
x+=lowbit(x);
}
}
int wen(long long c[],int x)
{
long long s=0;
while(x>=1)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
add(c1,i,x);add(c1,i+1,-x);
add(c2,i,-(i-1)*x);add(c2,i+1,i*x);
}
while(m--)
{
int o,x,y,z;
scanf("%s",str);
if(str[0]=='C')
{
scanf("%d%d%d",&x,&y,&z);
add(c1,x,z);add(c1,y+1,-z);
add(c2,x,-(x-1)*z);add(c2,y+1,y*z);
}
else
{
scanf("%d%d",&x,&y);
long long ans=wen(c1,y)*y+wen(c2,y)-wen(c1,x-1)*(x-1)-wen(c2,x-1);
printf("%lld\n",ans);
}
}
return 0;
}