input:simple.in output:simple.out

时间限制: 1000 ms 空间限制: 262144 KB

题目描述

​ 给你N个整数A1,A2,….,AN,你可以进行两种操作:一种把一给定区间的每个数是增加一个值;另一种是计算某一给定区间的数字的和。

输入

第一行包含两个整数N和Q.1<=N,Q<=100000

第二行包含N个整数,是A1,A2,….,AN的初始值。-1000000000<=Ai<=1000000000

接下来Q行,描述操作。

“C a b c”表示把Aa,Aa+1,….Ab都增加c,-10000<=c<=10000。

“Q a b”表示询问Aa,Aa+1,….,Ab的和。

输出

对于每个询问输出对应的和,每行一个。

样例输入

1
2
3
4
5
6
7
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

样例输出

1
2
3
4
4
55
9
15

数据范围限制

【限制】

30%数据 N,Q<=10000

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include<bits/stdc++.h>
using namespace std;
long long n,q,d,s,c1[100001],sum1[100001],c2[100001],a[100001];
char w;
long long lowbit(long long x)
{
return x&(-x);
}
long long sum(long long c[],long long x)
{
long long ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(long long c[],long long x,long long y)
{
while(x<=n)
{
c[x]+=y;
x+=lowbit(x);
}
}
int main()
{
freopen("simple.in","r",stdin);
freopen("simple.out","w",stdout);
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum1[i]=sum1[i-1]+a[i];
}
for(int j=1;j<=q;j++)
{
cin>>w;
cin>>s>>d;
if(int(w)==int('Q'))
{
long long suml=sum1[s-1]+s*sum(c1,s-1)-sum(c2,s-1);
long long sumd=sum1[d]+(d+1)*sum(c1,d)-sum(c2,d);
cout<<sumd-suml<<endl;
}
else
{
long long cost;
cin>>cost;
add(c1,s,cost);
add(c1,d+1,-cost);
add(c2,s,s*cost);
add(c2,d+1,-(d+1)*cost);
}
}
return 0;
}