#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 1000000 + 10;
int a[MAXN], n, m;
struct SegmentTree {
long long l, r, k, lmax, rmax, sum, add;
}t[MAXN * 4];
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if(l == r) {
t[p].sum = a[l];
return;
}
int mid = l+r >> 1;
build(p*2,l, mid);
build(p*2+1, mid+1, r);
t[p].sum = t[p*2].sum + t[p*2+1].sum;
}
void down(int p) {
if(t[p].add) {
t[p*2].sum += t[p].add * (t[p*2].r - t[p*2].l + 1);
t[p*2+1].sum += t[p].add * (t[p*2+1].r - t[p*2+1].l + 1);
t[p*2].add += t[p].add;
t[p*2+1].add += t[p].add;
t[p].add = 0;
}
}
void change(int p, int l, int r, int d) {
if(l <= t[p].l && r >= t[p].r) {
t[p].add += d;
t[p].sum += d * (t[p].r - t[p].l + 1);
return;
}
down(p);
int mid = t[p].l + t[p].r >> 1;
if(l <= mid)
change(p*2, l, r, d);
if(r > mid)
change(p*2+1, l, r, d);
t[p].sum = t[p*2].sum + t[p*2+1].sum;
}
long long que(int p, int l, int r) {
if(l <= t[p].l && r >= t[p].r)
return t[p].sum;
down(p);
int mid = t[p].l + t[p].r >> 1;
long long sum = 0;
if(l <= mid) {
sum += que(p*2, l, r);
}
if(r > mid) {
sum += que(p*2+1, l, r);
}
return sum;
}
int main() {
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
build(1,1,n);
for(int i=1; i<=m; i++) {
char temp;
int l,r,d;
cin >> temp;
scanf("%d %d",&l, &r);
if(temp == 'C') {
scanf("%d", &d);
change(1, l, r, d);
} else {
printf("%lld\n", que(1, l, r));
}
}
return 0;
}
区间修改线段树模板
猜你喜欢
转载自blog.csdn.net/fantasy_world/article/details/80027806
今日推荐
周排行