Submission #39363123


Source Code Expand

#include <bits/stdc++.h>

using i64 = long long;

constexpr int inf = 1E9 + 1;
template<class Info, class Tag>
struct LazySegmentTree {
    const int n;
    std::vector<Info> info;
    std::vector<Tag> tag;
    LazySegmentTree(int n) : n(n), info(4 << std::__lg(n)), tag(4 << std::__lg(n)) {}
    LazySegmentTree(std::vector<Info> init) : LazySegmentTree(init.size()) {
        std::function<void(int, int, int)> build = [&](int p, int l, int r) {
            if (r - l == 1) {
                info[p] = init[l];
                return;
            }
            int m = (l + r) / 2;
            build(2 * p, l, m);
            build(2 * p + 1, m, r);
            pull(p);
        };
        build(1, 0, n);
    }
    void pull(int p) {
        info[p] = info[2 * p] + info[2 * p + 1];
    }
    void apply(int p, const Tag &v) {
        info[p].apply(v);
        tag[p].apply(v);
    }
    void push(int p) {
        apply(2 * p, tag[p]);
        apply(2 * p + 1, tag[p]);
        tag[p] = Tag();
    }
    void modify(int p, int l, int r, int x, const Info &v) {
        if (r - l == 1) {
            info[p] = v;
            return;
        }
        int m = (l + r) / 2;
        push(p);
        if (x < m) {
            modify(2 * p, l, m, x, v);
        } else {
            modify(2 * p + 1, m, r, x, v);
        }
        pull(p);
    }
    void modify(int p, const Info &v) {
        modify(1, 0, n, p, v);
    }
    Info rangeQuery(int p, int l, int r, int x, int y) {
        if (l >= y || r <= x) {
            return Info();
        }
        if (l >= x && r <= y) {
            return info[p];
        }
        int m = (l + r) / 2;
        push(p);
        return rangeQuery(2 * p, l, m, x, y) + rangeQuery(2 * p + 1, m, r, x, y);
    }
    Info rangeQuery(int l, int r) {
        return rangeQuery(1, 0, n, l, r);
    }
    void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {
        if (l >= y || r <= x) {
            return;
        }
        if (l >= x && r <= y) {
            apply(p, v);
            return;
        }
        int m = (l + r) / 2;
        push(p);
        rangeApply(2 * p, l, m, x, y, v);
        rangeApply(2 * p + 1, m, r, x, y, v);
        pull(p);
    }
    void rangeApply(int l, int r, const Tag &v) {
        return rangeApply(1, 0, n, l, r, v);
    }
    void maintainL(int p, int l, int r, int pre) {
        if (info[p].difl > 0 && info[p].maxlowl < pre) {
            return;
        }
        if (r - l == 1) {
            info[p].max = info[p].maxlowl;
            info[p].maxl = info[p].maxr = l;
            info[p].maxlowl = info[p].maxlowr = -inf;
            return;
        }
        int m = (l + r) / 2;
        push(p);
        maintainL(2 * p, l, m, pre);
        pre = std::max(pre, info[2 * p].max);
        maintainL(2 * p + 1, m, r, pre);
        pull(p);
    }
    void maintainL() {
        maintainL(1, 0, n, -1);
    }
    void maintainR(int p, int l, int r, int suf) {
        if (info[p].difr > 0 && info[p].maxlowr < suf) {
            return;
        }
        if (r - l == 1) {
            info[p].max = info[p].maxlowl;
            info[p].maxl = info[p].maxr = l;
            info[p].maxlowl = info[p].maxlowr = -inf;
            return;
        }
        int m = (l + r) / 2;
        push(p);
        maintainR(2 * p + 1, m, r, suf);
        suf = std::max(suf, info[2 * p + 1].max);
        maintainR(2 * p, l, m, suf);
        pull(p);
    }
    void maintainR() {
        maintainR(1, 0, n, -1);
    }
};

struct Tag {
    int add = 0;
    
    void apply(Tag t) & {
        add += t.add;
    }
};

struct Info {
    int max = -1;
    int maxl = -1;
    int maxr = -1;
    int difl = inf;
    int difr = inf;
    int maxlowl = -inf;
    int maxlowr = -inf;
    
    void apply(Tag t) & {
        if (max != -1) {
            max += t.add;
        }
        difl += t.add;
        difr += t.add;
    }
};

Info operator+(Info a, Info b) {
    Info c;
    if (a.max > b.max) {
        c.max = a.max;
        c.maxl = a.maxl;
        c.maxr = a.maxr;
    } else if (a.max < b.max) {
        c.max = b.max;
        c.maxl = b.maxl;
        c.maxr = b.maxr;
    } else {
        c.max = a.max;
        c.maxl = a.maxl;
        c.maxr = b.maxr;
    }
    
    c.difl = std::min(a.difl, b.difl);
    c.difr = std::min(a.difr, b.difr);
    if (a.max != -1) {
        c.difl = std::min(c.difl, a.max - b.maxlowl);
    }
    if (b.max != -1) {
        c.difr = std::min(c.difr, b.max - a.maxlowr);
    }
    
    if (a.max == -1) {
        c.maxlowl = std::max(a.maxlowl, b.maxlowl);
    } else {
        c.maxlowl = a.maxlowl;
    }
    if (b.max == -1) {
        c.maxlowr = std::max(a.maxlowr, b.maxlowr);
    } else {
        c.maxlowr = b.maxlowr;
    }
    return c;
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    
    int N, Q;
    std::cin >> N >> Q;
    
    std::vector<int> A(N);
    for (int i = 0; i < N; i++) {
        std::cin >> A[i];
    }
    
    auto pre = A, suf = A;
    for (int i = 1; i < N; i++) {
        pre[i] = std::max(pre[i], pre[i - 1]);
    }
    for (int i = N - 2; i >= 0; i--) {
        suf[i] = std::max(suf[i], suf[i + 1]);
    }
    
    std::vector<Info> init(N);
    for (int i = 0; i < N; i++) {
        if (A[i] == pre[i] || A[i] == suf[i]) {
            init[i].max = A[i];
            init[i].maxl = init[i].maxr = i;
        } else {
            init[i].maxlowl = init[i].maxlowr = A[i];
        }
    }
    
    LazySegmentTree<Info, Tag> seg(init);
    
    for (int i = 0; i < Q; i++) {
        int T, X;
        std::cin >> T >> X;
        
        if (T == 1) {
            auto info = seg.rangeQuery(0, N);
            seg.rangeApply(0, std::min(X, info.maxr + 1), {-1});
            seg.maintainL();
        } else if (T == 2) {
            auto info = seg.rangeQuery(0, N);
            seg.rangeApply(std::max(N - X, info.maxl), N, {-1});
            seg.maintainR();
        } else {
            auto info = seg.rangeQuery(X - 1, X);
            int ans = info.max == -1 ? info.maxlowl : info.max;
            std::cout << ans << "\n";
        }
    }
    
    return 0;
}

Submission Info

Submission Time
Task E - 日本沈没 2 (Japan Sinks 2)
User jiangly
Language C++ (GCC 9.2.1)
Score 100
Code Size 6393 Byte
Status AC
Exec Time 368 ms
Memory 55940 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3 Subtask4 All
Score / Max Score 0 / 0 5 / 5 27 / 27 28 / 28 20 / 20 20 / 20
Status
AC × 4
AC × 14
AC × 20
AC × 5
AC × 12
AC × 43
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask1 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask2 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 01-05.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 03-03.txt, 04-05.txt, 04-07.txt, 04-08.txt, 05-05.txt, sample-02.txt
Subtask3 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, sample-01.txt
Subtask4 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 04-05.txt, 04-06.txt, 04-07.txt, 04-08.txt, 04-09.txt, 01-08.txt, 01-10.txt, sample-03.txt
All 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 02-01.txt, 02-02.txt, 02-03.txt, 02-04.txt, 02-05.txt, 02-06.txt, 02-07.txt, 02-08.txt, 02-09.txt, 03-01.txt, 03-02.txt, 03-03.txt, 03-04.txt, 04-01.txt, 04-02.txt, 04-03.txt, 04-04.txt, 04-05.txt, 04-06.txt, 04-07.txt, 04-08.txt, 04-09.txt, 05-01.txt, 05-02.txt, 05-03.txt, 05-04.txt, 05-05.txt, 05-06.txt, 05-07.txt, sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Case Name Status Exec Time Memory
01-01.txt AC 8 ms 3536 KiB
01-02.txt AC 3 ms 3616 KiB
01-03.txt AC 4 ms 3664 KiB
01-04.txt AC 5 ms 3720 KiB
01-05.txt AC 2 ms 3468 KiB
01-06.txt AC 2 ms 3820 KiB
01-07.txt AC 5 ms 3796 KiB
01-08.txt AC 4 ms 3704 KiB
01-09.txt AC 5 ms 3796 KiB
01-10.txt AC 5 ms 3716 KiB
02-01.txt AC 103 ms 30596 KiB
02-02.txt AC 75 ms 18576 KiB
02-03.txt AC 230 ms 55796 KiB
02-04.txt AC 368 ms 55780 KiB
02-05.txt AC 45 ms 3496 KiB
02-06.txt AC 71 ms 55940 KiB
02-07.txt AC 199 ms 55856 KiB
02-08.txt AC 237 ms 55788 KiB
02-09.txt AC 273 ms 55876 KiB
03-01.txt AC 190 ms 33760 KiB
03-02.txt AC 253 ms 55828 KiB
03-03.txt AC 44 ms 3504 KiB
03-04.txt AC 61 ms 55788 KiB
04-01.txt AC 35 ms 6412 KiB
04-02.txt AC 212 ms 28100 KiB
04-03.txt AC 248 ms 55876 KiB
04-04.txt AC 315 ms 55860 KiB
04-05.txt AC 50 ms 3464 KiB
04-06.txt AC 71 ms 55828 KiB
04-07.txt AC 182 ms 55832 KiB
04-08.txt AC 235 ms 55852 KiB
04-09.txt AC 265 ms 55880 KiB
05-01.txt AC 52 ms 31760 KiB
05-02.txt AC 63 ms 3568 KiB
05-03.txt AC 252 ms 55852 KiB
05-04.txt AC 319 ms 55832 KiB
05-05.txt AC 44 ms 3564 KiB
05-06.txt AC 72 ms 55736 KiB
05-07.txt AC 291 ms 55788 KiB
sample-01.txt AC 6 ms 3500 KiB
sample-02.txt AC 2 ms 3440 KiB
sample-03.txt AC 2 ms 3532 KiB
sample-04.txt AC 2 ms 3400 KiB