//TLE
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lch(n) ((n)<<1)
#define rch(n) ((n)<<1 | 1)
using namespace std;
typedef long long LL;
const int MAX_N = int(1e5);
LL sum[MAX_N<<2], add[MAX_N<<2];
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);
sum[n] = sum[lch(n)] + sum[rch(n)];
}
void modify(int a, int b, int d, int n, int l, int r){
if(a <= l && r <= b){
add[n] += d;
return;
}
//else if(r >= a && b >= l){
if(add[n]){
add[lch(n)] = add[rch(n)] = add[n];
add[n] = 0;
}
int mid = (l+r)>>1;
if(mid >= a) modify(a, b, d, lch(n), l, mid);
if(mid+1 <= b) modify(a, b, d, rch(n), mid+1, r);
if(add[lch(n)] && (add[lch(n)] == add[rch(n)])){
add[n] = add[lch(n)];
add[lch(n)] = add[rch(n)] = 0;
}
//}
}
LL query1(int a, int b, int n, int l, int r){
if(a <= l && r <= b){
return sum[n];
}
int res = 0, mid = (l+r)>>1;
if(mid >= a) res += query1(a, b, lch(n), l, mid);
if(mid+1 <= b) res += query1(a, b, rch(n), mid+1, r);
return res;
}
LL query2(int a, int b, int n, int l, int r){
if(add[n]){
return (min(b, r) - max(a, l) + 1)*add[n];
}
else if(l == r) return 0;
int res = 0, mid = (l+r)>>1;
if(a <= mid) res += query2(a, b, lch(n), l, mid);
if(mid+1 <= b) res += query2(a, b, rch(n), mid+1, r);
return res;
}
int main(){
int n, m;
while(~scanf("%d%d", &n, &m)){
build(1, 1, n);
char str[5];
int a, b, c;
while(m--){
scanf("%s", str);
if(str[0] == 'C'){
scanf("%d%d%d", &a, &b, &c);
modify(a, b, c, 1, 1, n);
}
else{
scanf("%d%d", &a, &b);
LL ans = 0;
ans += query1(a, b, 1, 1, n);
ans += query2(a, b, 1, 1, n);
printf("%I64d\n", ans);
}
}
}
return 0;
}
POJ 3468
最新推荐文章于 2020-03-21 13:10:11 发布