#include <cstring>
#include <climits>
#include <iostream>
#include <algorithm>
#define l(u) (u << 1)
#define r(u) (u << 1 | 1)
#define len(l, r) (r - l + 1)
using namespace std;
using LL = long long;
const int N = 2e5 + 10;
const LL inf = LONG_LONG_MAX;
LL n, f;
LL init[N];
struct Tree
{
LL l, r;
LL add, sum;
}tr[N << 2];
inline void pushup(LL u)
{
tr[u].sum = tr[l(u)].sum + tr[r(u)].sum;
}
inline void pushdown(LL u)
{
LL& x = tr[u].add;
if (x)
{
tr[l(u)].sum = len(tr[l(u)].l, tr[l(u)].r) * x;
tr[r(u)].sum = len(tr[r(u)].l, tr[r(u)].r) * x;
tr[l(u)].add += x;
tr[r(u)].add += x;
x = 0;
}
}
inline void build(LL u, LL l, LL r)
{
if ( l == r ) tr[u] = {l, r, 0, init[r]};
else {
tr[u] = {l, r};
int mid = (tr[u].r + tr[u].l) >> 1;
build(u << 1, l, mid); build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
inline LL ask(LL u, LL l, LL r)
{
if (tr[u].l >= l && tr[u].r <= r)
return tr[u].sum;
pushdown(u);
LL mid = tr[u].l + tr[u].r >> 1;
LL res = 0;
if (mid >= l) res += ask(u << 1, l, r);
if (mid < r) res += ask(u << 1 | 1, l, r);
return res;
}
inline void add(LL u, LL l, LL r, LL k)
{
if (tr[u].l >= l && tr[u].r <= r)
tr[u].add += k, tr[u].sum += len(tr[u].l, tr[u].r) * k;
else
{
pushdown(u);
LL mid = tr[u].l + tr[u].r >> 1;
if (mid >= l) add(l(u), l, r, k);
if (mid < r) add(r(u), l, r, k);
pushup(u);
}
}
int main(void)
{
scanf("%lld%lld", &n, &f);
for (register LL i = 1; i <= n; i ++ ) scanf("%lld", &init[i]);
build(1ll, 1ll, n);
LL op, l, r, k;
while (f -- )
{
scanf("%lld", &op);
if (op == 1)
{
scanf("%lld%lld%lld", &l, &r, &k);
add(1, l, r, k);
}
else
if (op == 2)
scanf("%lld", &k),
add(1, 1, 1, k);
else
if (op == 3)
scanf("%lld", &k),
add(1, 1, 1, -k);
else
if (op == 4)
scanf("%lld%lld", &l, &r),
printf("%lld\n", ask(1, l, r));
else
printf("%lld", ask(1, 1, 1));
}
return (0);
}
样例过了,但是全WA,不太明白是哪里出了问题,求奆佬赐教