请求查错
查看原帖
请求查错
214696
Dry_ice楼主2021/7/9 22:36

segment_tree

#include <stdio.h>
typedef long long LL;
const int N = 100005;
LL n, a[N], tr[4 * N], lazy[4 * N];
inline void pushup(LL id) {
    tr[id] = tr[id << 1] + tr[id << 1 | 1];
}
inline void pushdown(LL id) {
    if (lazy[id]) {
        lazy[id << 1] += lazy[id]; lazy[id << 1 | 1] += lazy[id];
        tr[id << 1] += lazy[id]; tr[id << 1 | 1] += lazy[id];
        lazy[id] = 0;
    }
}
inline void build(LL id, LL l, LL r) {
    if (l == r) {tr[id] = a[l]; return;}
    LL mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
    pushup(id);
}
inline void update(LL id, LL l, LL r, LL x, LL y, LL v) {
    if (x <= l && r <= y) {
        lazy[id] += v;
        tr[id] += v;
        return;
    }
    pushdown(id);
    LL mid = (l + r) >> 1;
    if (x <= mid) {
        update(id << 1, l, mid, x, y, v);
    }
    if (y > mid) {
        update(id << 1 | 1, mid + 1, r, x, y, v);
    }
	pushup(id);
}
inline LL query(LL id, LL l, LL r, LL x, LL y) {
    if (x <= l && r <= y) return tr[id];
    pushdown(id);
    LL mid = (l + r) >> 1, ans = 0x3f3f3f3f;
    if (x <= mid) ans += query(id << 1, l, mid, x, y);
    if (y > mid) ans += query(id << 1 | 1, mid + 1, r, x, y);
    return ans;
}
int main(void) {
    scanf("%d", &n);
    for (LL i = 1; i <= n; ++i)
        scanf("%d", &a[i]);
    build(1, 1, n);
    LL q; for (scanf("%d", &q); q--; ) {
        LL opt, x, y, v;
        scanf("%d %d %d", &opt, &x, &y);
        if (opt == 1) {
            scanf("%d", &v);
            update(1, 1, n, x, y, v);
        }
        else
            printf("%d\n", query(1, 1, n, x, y));
    }
    return 0;
}
output:
-50529018
-1111638584

请求查错。谢谢。

2021/7/9 22:36
加载中...