30分求调,和别人的错都不大一样……(调出来加微信打钱)
查看原帖
30分求调,和别人的错都不大一样……(调出来加微信打钱)
493092
1zerom楼主2022/7/30 00:26
#include <bits/stdc++.h>
using namespace std;
struct node {
    long long sum, l, r, add, mul;
} t[4000000];
long long n, m, p;
long long a[4000000];
void pushup(long long rt) {
    t[rt].sum = t[rt << 1].sum % p + t[rt << 1 | 1].sum % p;
    t[rt].sum %= p;
}
void build(long long rt, long long l, long long r) {
    t[rt].l = l, t[rt].r = r;
    if (l == r) {
        t[rt].sum = a[l] % p;
        t[rt].sum = t[rt].sum % p;
        t[rt].add = 0;
        t[rt].mul = 1;
        return;
    }
    long long mid = (l + r) >> 1;
    build(rt << 1, l, mid);
    build(rt << 1 | 1, mid + 1, r);
    pushup(rt);
    return;
}
void pushdown(long long rt) {
    if (t[rt].mul != 1 || t[rt].add) {  //
        t[rt << 1].add = (t[rt << 1].add * t[rt].mul + t[rt].add) % p;
        t[rt << 1 | 1].add = (t[rt << 1 | 1].add * t[rt].mul + t[rt].add) % p;
        t[rt << 1].mul = (t[rt << 1].mul * t[rt].mul) % p;
        t[rt << 1 | 1].mul = (t[rt << 1 | 1].mul * t[rt].mul) % p;
        t[rt << 1].sum = (t[rt << 1].sum * t[rt].mul +
                          t[rt].add * (t[rt << 1].r - t[rt << 1].l + 1)) %
                         p;
        t[rt << 1 | 1].sum =
            (t[rt << 1 | 1].sum * t[rt].mul +
             t[rt].add * (t[rt << 1 | 1].r - t[rt << 1 | 1].l + 1)) %
            p;
    }
    t[rt].mul = 1;
    t[rt].add = 0;
}
void change(long long rt, long long l, long long r, long long x) {
    if (l <= t[rt].l && t[rt].r <= r) {
        t[rt].add += x % p;
        t[rt].add %= p;
        t[rt].sum += x * (t[rt].r - t[rt].l + 1) % p;
        t[rt].sum = t[rt].sum % p;
        return;
    }
    pushdown(rt);
    long long mid = (t[rt].l + t[rt].r) >> 1;
    if (l <= mid) change(rt << 1, l, r, x);
    if (mid < r) change(rt << 1 | 1, l, r, x);
    pushup(rt);
    return;
}
void change2(long long rt, long long l, long long r, long long x) {
    if (l <= t[rt].l && t[rt].r <= r) {
        if (t[rt].mul == 0) t[rt].mul = 1;
        t[rt].mul *= x % p;
        t[rt].mul %= p;
        t[rt].add = x * t[rt].add % p;
        t[rt].add %= p;
        t[rt].sum *= x;
        t[rt].sum = t[rt].sum % p;
        return;
    }
    pushdown(rt);
    long long mid = (t[rt].l + t[rt].r) >> 1;
    if (l <= mid) change2(rt << 1, l, r, x);
    if (mid < r) change2(rt << 1 | 1, l, r, x);
    pushup(rt);
    return;
}
long long query(long long rt, long long l, long long r) {
    if (l > t[rt].r || t[rt].l > r) return 0;
    if (l <= t[rt].l && t[rt].r <= r) {
        return t[rt].sum % p;
    }
    pushdown(rt);
    long long mid = (t[rt].l + t[rt].r) >> 1;
    long long res = 0;
    if (l <= mid) res += query(rt << 1, l, r);
    res = res % p;
    if (mid < r) res += query(rt << 1 | 1, l, r);
    res = res % p;
    pushup(rt);
    return res;
}
int main() {
    freopen("E:/Downloads/P3373_2.in", "r", stdin);
    freopen("E:/Downloads/P3373.out", "w", stdout);
    cin >> n >> m >> p;
    for (long long i = 1; i <= n; i++) {
        cin >> a[i];
    }
    build(1, 1, n);
    for (long long i = 1; i <= m; i++) {
        long long f, x, y, k;
        cin >> f;
        if (f == 1) {
            cin >> x >> y >> k;
            change2(1, x, y, k);
        }
        if (f == 2) {
            cin >> x >> y >> k;
            change(1, x, y, k);
        }
        if (f == 3) {
            cin >> x >> y;
            cout << query(1, x, y) % p << endl;
        }
    }
}

球球了卡了三天了,有能调出来的加微信yxzlwz打钱(认真

2022/7/30 00:26
加载中...