线段树 WA50 求调

P1253 扶苏的问题

残阳如血 @ 2024-05-04 11:37:33

#include <iostream>
typedef long long lint;
const int N = 1e6 + 10;
const lint INF = -1e18;

int n, q, a[N];
lint w[4 * N], lzy_set[4 * N], lzy_add[4 * N];

bool inRange(int l, int r, int L, int R) {
    return l >= L && r <= R;
}

bool outRange(int l, int r, int L, int R) {
    return l > R || r < L;
}

void maketag(int u, int x, int type) { // 1:设置  0:加上
    if (type) lzy_add[u] = 0, lzy_set[u] = w[u] = x;
    else {
        if (lzy_set[u] == INF) lzy_add[u] += x;
        else lzy_set[u] += x;
        w[u] += x;
    }
}

void pushup(int u) {
    w[u] = std::max(w[u * 2], w[u * 2 + 1]);
}

void pushdown(int u) {
    if (lzy_set[u] == INF) { // 加上
        maketag(u * 2, lzy_add[u], 0);
        maketag(u * 2 + 1, lzy_add[u], 0);
        lzy_add[u] = 0;
    } else { // 设置
        maketag(u * 2, lzy_set[u], 1);
        maketag(u * 2 + 1, lzy_set[u], 1);
        lzy_set[u] = INF;
    }
}

void build(int u, int l, int r) {
    lzy_set[u] = INF; // 赋值为一个不可能出现的数值
    if (l == r) {
        w[u] = a[l];
        return ;
    }
    int mid = l + r >> 1;
    build(u * 2, l, mid);
    build(u * 2 + 1, mid + 1, r);
    pushup(u);
}

lint query(int u, int l, int r, int L, int R) { // 查询
    if (outRange(l, r, L, R)) return INF;
    if (inRange(l, r, L, R)) return w[u];
    int mid = l + r >> 1;
    pushdown(u);
    return std::max(query(u * 2, l, mid, L, R), query(u * 2 + 1, mid + 1 , r, L, R));
}

void update(int u, int l, int r, int L, int R, int x, int type) { // 更新
    if (outRange(l, r, L, R)) return ;
    if (inRange(l, r, L, R)) { maketag(u, x, type); return ; }
    int mid = l + r >> 1;
    pushdown(u);
    update(u * 2, l, mid, L, R, x, type);
    update(u * 2 + 1, mid + 1, r, L, R, x, type);
    pushup(u);
}

int main() {
    std::cin.tie(0)->sync_with_stdio(0);
    std::cin >> n >> q;
    for (int i = 1; i <= n; ++i) std::cin >> a[i];
    build(1, 1, n);
    for (int op, l, r, x; q; --q) {
        std::cin >> op >> l >> r;
        if (op == 1) std::cin >> x, update(1, 1, n, l, r, x, 1);
        else if (op == 2) std::cin >> x, update(1, 1, n, l, r, x, 0);
        else std::cout << query(1, 1, n, l, r) << '\n';
    }
    std::cout.flush();
    return 0;
}

by 残阳如血 @ 2024-05-04 11:44:42

没开 long long 寄了


|