具体代码如下
#include<iostream>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 100010;
int n, m;
int a[N];
LL tr1[N], tr2[N];
int lowbit(int x){
return x & -x;
}
void add(LL tr[], int x, LL c){
for(int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}
LL sum(LL tr[], int x){
LL res = 0;
for(int i = x; i; i -= lowbit(i)) res += tr[i];
return res;
}
LL get_sum(int x){
return sum(tr1, x) * (x+1) - sum(tr2, x);
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; ++ i) scanf("%d", &a[i]);
for(int i = 1; i <= n; ++ i){
add(tr1, i, a[i] - a[i - 1]);
add(tr2, i, (LL)i * (a[i] - a[i - 1]));
}
while(m --){
char op[2];
int l, r, x;
scanf("%s", op);
if(*op == 'Q'){
scanf("%d%d", &l, & r);
printf("%lld\n", get_sum(r) - get_sum(l - 1));
}else{
scanf("%d%d%d", &l, &r, &x);
add(tr1, l, x), add(tr1, r + 1, -x);
add(tr2, l, l * x), add(tr2, r + 1, (r + 1) * -x);
}
}
return 0;
}