线段树区间更新+查询
白书上板子,看清楚有的地方 L 和 1 不清楚
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<set>
#include<queue>
#include<stack>
#include<map>
#define PI acos(-1.0)
#define in freopen("in.txt", "r", stdin)
#define out freopen("out.txt", "w", stdout)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//const int maxn = 50 + 7, maxd = 1e4 + 7, mod = 1234567;
//const ll INF = 0x7f7f7f7f;
const int DAT_SIZE = (1 << 18) - 1;
const int maxn = 1e5+7;
int n, m;
int N, Q;
int a[maxn];
char t[maxn];
int L[maxn], R[maxn], X[maxn];
ll data[DAT_SIZE], datb[DAT_SIZE];
void add(int a, int b, int x, int k, int l, int r) {
if(a <= l && r <= b) {
data[k] += x;
}
else if(l < b && a < r) {
datb[k] += (min(b,r) - max(a,l)) * x;
add(a, b, x, k*2+1, l, (l+r)/2);
add(a, b, x, k*2+2, (l+r)/2, r);
}
}
ll sum(int a, int b, int k, int l, int r) {
if(b <= l || r <= a) {
return 0;
}
else if(a <= l && r <= b) {
return data[k] * (r-l) + datb[k];
}
else {
ll res = (min(b,r) - max(a,l)) * data[k];
res += sum(a, b, k*2+1, l, (l+r)/2);
res += sum(a, b, k*2+2, (l+r)/2, r);
return res;
}
}
void solve() {
for(int i = 0; i < m; ++i) {
int l_, r_, v; char c[4];
scanf("%s %d %d", c, &l_, &r_);
if(c[0] == 'C') {
scanf("%d", &v);
add(l_-1, r_, v, 0, 0, n);
}
else {
printf("%lld\n", sum(l_-1, r_, 0, 0, n));
}
}
}
int main() {
scanf("%d %d", &n, &m);
for(int i = 0; i < n; ++i) {
scanf("%d", &a[i]);
add(i, i+1, a[i], 0, 0, n);
}
solve();
return 0;
}