segment_tree的调试
查看原帖
segment_tree的调试
214696
Dry_ice楼主2021/7/16 22:57

全 wa,却找不到错。

#include <stdio.h>
typedef long long LL;
const int N = 100005;
LL n, p, a[N], tr[N << 2], lazy1[N << 2], lazy2[N << 2];
inline void pushup(LL id) {
    tr[id] = (tr[id << 1] + tr[id << 1 | 1]) % p;
}
inline void pushdown(LL id, LL l, LL r, LL mid) {
    tr[id << 1] = (tr[id << 1] * lazy2[id] %  p+ (mid - l + 1) * lazy1[id] % p) % p;
    tr[id << 1 | 1] = (tr[id << 1 | 1] * lazy2[id] % p + (r - mid) * lazy1[id] % p) % p;
    lazy2[id << 1] = (lazy2[id << 1] * lazy2[id]) % p;
    lazy2[id << 1 | 1] = (lazy2[id << 1 | 1] * lazy2[id]) % p;
    lazy1[id << 1] = (lazy1[id << 1] * lazy2[id] + lazy1[id]) % p;
    lazy1[id << 1 | 1] = (lazy1[id << 1 | 1] * lazy2[id] + lazy1[id]) % p;
    lazy1[id] = 0; lazy2[id] = 1;
}
inline void build(LL id, LL l, LL r) {
    if (l == r) {tr[id] = a[l] % p; lazy1[l] = 0; lazy2[l] = 1; return;}
    LL mid = (l + r) >> 1;
    build(id << 1, l, mid);
    build(id << 1 | 1, mid + 1, r);
    pushup(id);
}
inline void update1(LL id, LL l, LL r, LL x, LL y, LL v) {
    if (x <= l && r <= y) {
        lazy1[id] = (lazy1[id] * v) % p;
        lazy2[id] = (lazy2[id] * v) % p;
        tr[id] = (tr[id] * v) % p;
        return;
    }
    LL mid = (l + r) >> 1;
    pushdown(id, l, r, mid);
    // pushup(id);
    if (x <= mid) {
        update1(id << 1, l, mid, x, y, v);
    }
    if (y > mid) {
        update1(id << 1 | 1, mid + 1, r, x, y, v);
    }
    pushup(id);
}
inline void update2(LL id, LL l, LL r, LL x, LL y, LL v) {
    if (x <= l && r <= y) {
        lazy1[id] = (lazy1[id] + v) % p;
        tr[id] = (tr[id] + (r - l + 1) * v) % p;
        return;
    }
    LL mid = (l + r) >> 1;
    pushdown(id, l, r, mid);
    // pushup(id);
    if (x <= mid) {
        update2(id << 1, l, mid, x, y, v);
    }
    if (y > mid) {
        update2(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];
    LL mid = (l + r) >> 1, ans = 0;
    pushdown(id, l, r, mid);
    if (x <= mid) ans = (ans + query(id << 1, l, mid, x, y)) % p;
    if (y > mid) ans = (ans + query(id << 1 | 1, mid + 1, r, x, y)) % p;
    return ans;
}
int main(void) {
    LL m;
    scanf("%lld %lld %lld", &n, &m, &p);
    for (LL i = 1; i <= n; ++i)
        scanf("%lld", &a[i]);
    build(1, 1, n);
    for (; m--; ) {
        LL opt, x, y, v;
        scanf("%lld %lld %lld", &opt, &x, &y);
        if (opt == 1) {
            scanf("%lld", &v);
            update1(1, 1, n, x, y, v);
        }
        else
            if (opt == 2) {
                scanf("%lld", &v);
                update2(1, 1, n, x, y, v);
            }
            else
                printf("%lld\n", query(1, 1, n, x, y));
    }
    return 0;
}

SOS\text{SOS}

2021/7/16 22:57
加载中...