题意
代码
#include <bits/stdc++.h>
using namespace std;
#define ls (k << 1)
#define rs (k << 1 | 1)
#define ll long long
const int N = 1e5 + 10;
int n, m;
int a[N];
struct Tree
{
int l, r; ll sum, add;
} tr[N * 4];
void push_up(int k)
{
tr[k].sum = tr[ls].sum + tr[rs].sum;
}
void push_down(int k)
{
if (tr[k].add)
{
Tree & root = tr[k], & left = tr[ls], & right = tr[rs];
left.add += root.add, left.sum += 1LL * (left.r - left.l + 1) * root.add;
right.add += root.add, right.sum += 1LL * (right.r - right.l + 1) * root.add;
root.add = 0;
}
}
void build(int k, int l, int r)
{
tr[k] = { l, r };
if (l == r)
{
tr[k] = { l, r, a[l], 0 };
return;
}
int md = (l + r) >> 1;
build(ls, l, md);
build(rs, md + 1, r);
push_up(k);
}
void modify(int k, int l, int r, int d)
{
if (tr[k].l >= l && tr[k].r <= r)
{
tr[k].sum += 1LL * (tr[k].r - tr[k].l + 1) * d;
tr[k].add += d;
return;
}
push_down(k);
int md = (tr[k].l + tr[k].r) >> 1;
if (l <= md) modify(ls, l, r, d);
if (r > md) modify(rs, l, r, d);
push_up(k);
}
ll query(int k, int l, int r)
{
if (tr[k].l >= l && tr[k].r <= r) return tr[k].sum;
push_down(k);
int md = (tr[k].l + tr[k].r) >> 1;
ll sum = 0;
if (l <= md) sum += query(ls, l, r);
if (r > md) sum += query(rs, 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);
char op[2]; int l, r, d;
while (m --)
{
scanf("%s %d %d", op, &l, &r);
if (op[0] == 'C')
{
scanf("%d", &d);
modify(1, l, r, d);
}
else
{
printf("%lld\n", query(1, l, r));
}
}
return 0;
}