为什么我大小数组大小开到4e5会段错误过不了?
查看原帖
为什么我大小数组大小开到4e5会段错误过不了?
22716
神仙酱楼主2024/3/3 11:33
#include <bits/stdc++.h>
#define LEN (r - l + 1)
#define LC u << 1, l, mid
#define RC u << 1 | 1, mid + 1, r
#define PA u, l, r
using namespace std;
using ll = long long;
const int N = 1e5 + 10;
enum { Add = 2, Mul = 1 };
ll sum[N << 2], add[N << 2], mul[N << 2];
int n, mod;

void update(int u, int l, int r, int c, int op) {
    if (op == Add) {
        add[u] = (add[u] + c) % mod;
        sum[u] = (sum[u] + c * LEN) % mod;
    }
    else {
        add[u] = (add[u] * c) % mod;
        mul[u] = (mul[u] * c) % mod;
        sum[u] = (sum[u] * c) % mod;
    }
}

void pushdown(int u, int l, int r) {
    int mid = l + r >> 1;
    if (mul[u] != 1) {
        update(LC, mul[u], Mul);
        update(RC, mul[u], Mul);
        mul[u] = 1;
    }
    if (add[u]) {
        update(LC, add[u], Add);
        update(RC, add[u], Add);
        add[u] = 0;
    }
}

void pushup(int u) {
    sum[u] = (sum[u << 1] + sum[u << 1 | 1]) % mod;
}

void build(int u, int l, int r) {
    mul[u] = 1;
    if (l == r) {
        ll x;
        cin >> x;
        sum[u] = x % mod;
    }
    else {
        int mid = l + r >> 1;
        build(LC);
        build(RC);
        pushup(u);
    }
}

void modify(int u, int l, int r, int p, int q, int c, int op) {
    if (p <= l && r <= q) {
        update(PA, c, op);
    }
    else {
        pushdown(PA);
        int mid = l + r >> 1;
        if (p <= mid)
            modify(LC, p, q, c, op);
        if (mid < q)
            modify(RC, p, q, c, op);
        pushup(u);
    }
}

ll query(int u, int l, int r, int p, int q) {
    pushdown(PA);
    if (p <= l && r <= q)
        return sum[u];
    ll ans = 0;
    int mid = l + r >> 1;
    if (p <= mid)
        ans = query(LC, p, q) % mod;
    if (mid < q)
        ans = (ans + query(RC, p, q)) % mod;
    return ans;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen(".in", "r", stdin);
#else
    ios::sync_with_stdio(false);
#endif
    cin.tie(0);
    cin >> n >> mod;
    build(1, 1, n);
    int m;
    cin >> m;
    while (m--) {
        int op, l, r, c;
        cin >> op;
        if (op <= 2) {
            cin >> l >> r >> c;
            modify(1, 1, n, l, r, c, op);
        }
        else {
            cin >> l >> r;
            cout << query(1, 1, n, l, r) << "\n";
        }
    }
    return 0;
}
2024/3/3 11:33
加载中...