比赛 树形数据结构拔高 评测结果 WWWWWWWWWW
题目名称 聪聪的世界 最终得分 0
用户昵称 健康铀 运行时间 8.671 s
代码语言 C++ 内存使用 31.54 MiB
提交时间 2025-04-17 19:52:50
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int MX = 1e6 + 10;

struct N {
    int l, r;
    int mn, mx;
    int lz;
} t[4 * MX];

int a[MX];

void pd(int nd) {
    if (t[nd].lz != 0 && t[nd].l != t[nd].r) {
        int d = t[nd].lz;

        t[2*nd].mn += d;
        t[2*nd].mx += d;
        t[2*nd].lz += d;

        t[2*nd+1].mn += d;
        t[2*nd+1].mx += d;
        t[2*nd+1].lz += d;

        t[nd].lz = 0;
    }
}

void bd(int nd, int l, int r) {
    t[nd].l = l;
    t[nd].r = r;
    t[nd].lz = 0;
    if (l == r) {
        t[nd].mn = a[l];
        t[nd].mx = a[l];
        return;
    }
    int m = (l + r) / 2;
    bd(2*nd, l, m);
    bd(2*nd+1, m+1, r);
    t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
    t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}

void ur(int nd, int l, int r, int d) {
    if (t[nd].r < l || t[nd].l > r) return;
    if (l <= t[nd].l && t[nd].r <= r) {
        t[nd].mn += d;
        t[nd].mx += d;
        t[nd].lz += d;
        return;
    }
    pd(nd);
    ur(2*nd, l, r, d);
    ur(2*nd+1, l, r, d);
    t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
    t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}

int qp(int nd, int p) {
    if (t[nd].l == t[nd].r) {
        return t[nd].mn;
    }
    pd(nd);
    int m = (t[nd].l + t[nd].r) / 2;
    if (p <= m) {
        return qp(2*nd, p);
    } else {
        return qp(2*nd+1, p);
    }
}

void up(int nd, int p, int v) {
    if (t[nd].l == t[nd].r) {
        t[nd].mn = v;
        t[nd].mx = v;
        return;
    }
    pd(nd);
    int m = (t[nd].l + t[nd].r) / 2;
    if (p <= m) {
        up(2*nd, p, v);
    } else {
        up(2*nd+1, p, v);
    }
    t[nd].mn = min(t[2*nd].mn, t[2*nd+1].mn);
    t[nd].mx = max(t[2*nd].mx, t[2*nd+1].mx);
}

int qml(int nd, int l, int r, int v) {
    if (t[nd].r < l || t[nd].l > r) return -1;
    pd(nd);
    if (t[nd].mn >= v) return -1;

    if (t[nd].l == t[nd].r) {
        return t[nd].l;
    }

    int rr = qml(2*nd+1, l, r, v);
    if (rr != -1) return rr;

    return qml(2*nd, l, r, v);
}

int qmg(int nd, int l, int r, int v) {
    if (t[nd].r < l || t[nd].l > r) return -1;
    pd(nd);
    if (t[nd].mx <= v) return -1;

    if (t[nd].l == t[nd].r) {
        return t[nd].l;
    }

    int rr = qmg(2*nd+1, l, r, v);
    if (rr != -1) return rr;

    return qmg(2*nd, l, r, v);
}

int qnl(int nd, int l, int r, int v) {
    if (t[nd].r < l || t[nd].l > r) return -1;
    pd(nd);
    if (t[nd].mn >= v) return -1;

    if (t[nd].l == t[nd].r) {
        return t[nd].l;
    }

    int lr = qnl(2*nd, l, r, v);
    if (lr != -1) return lr;

    return qnl(2*nd+1, l, r, v);
}

int qng(int nd, int l, int r, int v) {
    if (t[nd].r < l || t[nd].l > r) return -1;
    pd(nd);
    if (t[nd].mx <= v) return -1;

    if (t[nd].l == t[nd].r) {
        return t[nd].l;
    }

    int lr = qng(2*nd, l, r, v);
    if (lr != -1) return lr;

    return qng(2*nd+1, l, r, v);
}

int main() {
    freopen("ccsworld.in", "r", stdin);
    freopen("ccsworld.out", "w", stdout);
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }
    bd(1, 1, n);

    while (m--) {
        int op, x, y, w;
        scanf("%d", &op);
        if (op >= 1 && op <= 4) {
            scanf("%d", &x);
            int vx = qp(1, x);
            int p = -1;
            if (op == 1) {
                if (x > 1) {
                    p = qml(1, 1, x-1, vx);
                }
            } else if (op == 2) {
                if (x > 1) {
                    p = qmg(1, 1, x-1, vx);
                }
            } else if (op == 3) {
                if (x < n) {
                    p = qnl(1, x+1, n, vx);
                }
            } else {
                if (x < n) {
                    p = qng(1, x+1, n, vx);
                }
            }
            if (p == -1) {
                printf("-1\n");
            } else {
                printf("%d\n", qp(1, p));
            }
        } else if (op == 5) {
            scanf("%d%d", &x, &y);
            if (x == y) continue;
            int vx = qp(1, x);
            int vy = qp(1, y);
            up(1, x, vy);
            up(1, y, vx);
        } else if (op == 6 || op == 7) {
            scanf("%d%d%d", &x, &y, &w);
            if (op == 7) {
                w = -w;
            }
            ur(1, x, y, w);
        }
    }
    return 0;
}