#include <cstdio>
#define int long long int
const int N = 1e5;
int n, q, a[N];
struct node {
int l, r;
int sum, tag;
} tr[4 * N];
#define lsp(p) ((p) << 1)
#define rsp(p) ((p) << 1 | 1)
#define in_range(n1, n2, n3, n4) ((n1) <= (n2) && (n3) <= (n4))
void push_down(int p) {
if (tr[p].l == tr[p].r || tr[p].tag == 0) return;
tr[lsp(p)].sum += tr[p].tag * (tr[lsp(p)].r - tr[lsp(p)].l + 1);
tr[lsp(p)].tag += tr[p].tag;
tr[rsp(p)].sum += tr[p].tag * (tr[rsp(p)].r - tr[rsp(p)].l + 1);
tr[rsp(p)].tag += tr[p].tag;
tr[p].tag = 0;
}
void push_up(int p) {
tr[p].sum = tr[lsp(p)].sum + tr[rsp(p)].sum;
}
void build(int p = 1, int l = 1, int r = n) {
tr[p].l = l, tr[p].r = r;
//if (l == r) printf("bld (%lld %lld), now (%lld %lld)\n", l, r, p, a[tr[p].l]);
if (l == r) { tr[p].sum = a[tr[p].l]; return; }
int mid = l + r >> 1;
build(lsp(p), l, mid);
build(rsp(p), mid + 1, r);
push_up(p);
//printf("bld (%lld %lld), now (%lld %lld)\n", l, r, p, tr[p].sum);
}
void update(int c, int x, int y, int p = 1) {
//printf("upd (%lld %lld), now (%lld %lld)\n", x, y, tr[p].l, tr[p].r);
if (in_range(x, tr[p].l, tr[p].r, y)) {
//puts("add tag");
tr[p].tag += c;
tr[p].sum += tr[p].tag * (tr[p].r - tr[p].l + 1);
return;
}
push_down(p);
if (x <= tr[lsp(p)].r) update(c, x, y, lsp(p));
if (y >= tr[rsp(p)].l) update(c, x, y, rsp(p));
push_up(p);
}
int query(int x, int y, int p = 1) {
if (in_range(x, tr[p].l, tr[p].r, y)) return tr[p].sum;
push_down(p);
int res = 0;
if (x <= tr[lsp(p)].r) res += query(x, y, lsp(p));
if (y >= tr[rsp(p)].l) res += query(x, y, rsp(p));
push_up(p);
return res;
}
signed main() {
scanf("%lld %lld", &n, &q);
for (int i = 1; i <= n; i++) scanf("%lld", a + i);
build();
while (q--) {
int op;
scanf("%lld", &op);
if (op == 1) {
int s, t, x;
scanf("%lld %lld %lld", &s, &t, &x);
update(x, s, t);
} else {
int s, t;
scanf("%lld %lld", &s, &t);
printf("%lld\n", query(s, t));
}
}
return 0;
}
自己的第一个线段树板子求调,只过#1,其他都WA了,玄关
自己调了好久都没调好
心态崩了