You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.4 KiB
C++

#include <cstdio>
typedef long long int64;
#define lch(x) ((x) << 1)
#define rch(x) ((x) << 1 | 1)
#define avg(x, y) (((x) + (y)) >> 1)
inline int min(int a, int b)
{
return a < b ? a : b;
}
inline int max(int a, int b) { return a > b ? a : b; }
const int N = 100010;
int64 sum[N << 2], add[N << 2], a[N];
void build(int k, int l, int r)
{
if (l + 1 == r) return void(sum[k] = a[l]);
int m = avg(l, r);
build(lch(k), l, m);
build(rch(k), m, r);
sum[k] += sum[lch(k)] + sum[rch(k)];
}
void modify(int k, int l, int r, int x, int y, int v)
{
if (x <= l && r <= y) return void(add[k] += v);
sum[k] += (min(r, y) - max(l, x)) * v;
int m = avg(l, r);
if (x < m) modify(lch(k), l, m, x, y, v);
if (y > m) modify(rch(k), m, r, x, y, v);
}
int64 query(int k, int l, int r, int x, int y)
{
if (x <= l && r <= y) return sum[k] + (r - l) * add[k];
int m = avg(l, r);
return (min(r, y) - max(l, x)) * add[k] +
(x < m ? query(lch(k), l, m, x, y) : 0) +
(y > m ? query(rch(k), m, r, x, y) : 0);
}
int main()
{
int n, m, op1, op2, op3;
char op[2];
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++) scanf("%lld", a + i);
build(1, 0, n);
while (m--)
{
scanf("%s%d%d", op, &op1, &op2);
if (op[0] == 'Q')
printf("%lld\n", query(1, 0, n, op1 - 1, op2));
else
scanf("%d", &op3), modify(1, 0, n, op1 - 1, op2, op3);
}
return 0;
}