//4796K 2563MS
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lch(x) ((x)<<1)
#define rch(x) ((x)<<1 | 1)
using namespace std;
typedef long long LL;
const int MAX_N = 100000;
LL add[MAX_N<<2];
LL sum[MAX_N<<2];
inline void push_up(int n){
sum[n] = sum[lch(n)] + sum[rch(n)];
}
inline void push_down(int n, int m){
if(add[n]){
add[lch(n)] += add[n];
add[rch(n)] += add[n];
int mid = m>>1;
sum[lch(n)] += add[n]*(m - mid);
sum[rch(n)] += add[n]*mid;
add[n] = 0;
}
}
void build(int n, int l, int r){
add[n] = 0;
if(l == r){
scanf("%I64d", &sum[n]);
return;
}
int mid = (l+r)>>1;
build(lch(n), l, mid);
build(rch(n), mid+1, r);
push_up(n);
}
void modify(int a, int b, int d, int n, int l, int r){
if(a <=l && r <= b){
add[n] += d;
sum[n] += (LL)d*(r - l + 1);
return;
}
push_down(n, r - l + 1);
int mid = (l+r)>>1;
if(a <= mid) modify(a, b, d, lch(n), l, mid);
if(mid+1 <= b) modify(a, b, d, rch(n), mid+1, r);
push_up(n);
}
LL query(int a, int b, int n, int l, int r){
if(a <= l && r <= b){
return sum[n];
}
push_down(n, r - l + 1);
int mid = (l+r)>>1;
LL res = 0;
if(a <= mid) res += query(a, b, lch(n), l, mid);
if(mid+1 <= b) res += query(a, b, rch(n), mid+1, r);
return res;
}
int main(){
int N, Q;
while(~scanf("%d%d", &N, &Q)){
build(1, 1, N);
char str[5];
int a, b, c;
for(int i=1; i<=Q; i++){
scanf("%s", str);
if(str[0] == 'C'){
scanf("%d%d%d", &a, &b, &c);
modify(a, b, c, 1, 1, N);
}
else if(str[0] == 'Q'){
scanf("%d%d", &a, &b);
printf("%I64d\n", query(a, b, 1, 1, N));
}
}
}
return 0;
}
POJ 3468
最新推荐文章于 2020-03-21 13:10:11 发布