Submission #1266896

#TimeUsernameProblemLanguageResultExecution timeMemory
1266896uranium235Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
1292 ms81084 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

struct state {
    int max = 0, rawMax = 0, st = INT32_MAX;
    void merge(state &l, state &r) {
        rawMax = std::max(l.rawMax, r.rawMax);
        max = std::max(l.max, r.max);
    }
    void push(state &l, state &r) {
        if (st == INT32_MAX) return;
        l.lazySet(st);
        r.lazySet(st);
        st = INT32_MAX;
    }
    void apply(int x) {
        lazySet(x);
    }
    int fold() {
        return max;
    }
    void lazySet(int x) {
        st = x;
        max = rawMax + x;
    }
};

class lazyseg {
    public:
        int n;
        vector<state> a;
        lazyseg(int n, const vector<int> &books) : n(n), a(4 * n) {
            build(0, n - 1, 1, books);
        }
        void build(int l, int r, int v, const vector<int> &books) {
            if (l == r) {
                a[v].max = a[v].rawMax = books[l];
            } else {
                int m = (l + r) / 2;
                build(l, m, 2 * v, books);
                build(m + 1, r, 2 * v + 1, books);
                a[v].merge(a[2 * v], a[2 * v + 1]);
            }
        }
        void upd(int ll, int rr, int l, int r, int v, int x) {
            if (r < ll || rr < l) return;
            else if (ll <= l && r <= rr) a[v].apply(x);
            else {
                a[v].push(a[2 * v], a[2 * v + 1]);
                int m = (l + r) / 2;
                upd(ll, rr, l, m, 2 * v, x);
                upd(ll, rr, m + 1, r, 2 * v + 1, x);
                a[v].merge(a[2 * v], a[2 * v + 1]);
            }
        }
        int qry(int ll, int rr, int l, int r, int v) {
            if (r < ll || rr < l) return INT32_MIN;
            else if (ll <= l && r <= rr) return a[v].fold();
            else {
                a[v].push(a[2 * v], a[2 * v + 1]);
                int m = (l + r) / 2;
                return max(qry(ll, rr, l, m, 2 * v), qry(ll, rr, m + 1, r, 2 * v + 1));
            }
        }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, q;
    cin >> n >> q;
    vector<int> books(n);
    for (int &i : books) cin >> i;

    lazyseg tree(n, books);
    vector<array<int, 5>> queries;
    queries.reserve(q);
    for (int i = 0; i < q; i++) {
        int l, r, k;
        cin >> l >> r >> k;
        l--, r--;
        queries.push_back({l, r, k, i, -1});
    }
    sort(queries.begin(), queries.end(), [](const array<int, 5> &l, const array<int, 5> &r) {
        return l[0] < r[0];
    });
    int ptr = q - 1;
    stack<pair<int, int>> stak;
    stak.push({n, INT32_MAX});
    tree.upd(0, n - 1, 0, n - 1, 1, INT32_MIN);
    for (int i = n - 1; i >= 0; i--) {
        while (stak.top().second < books[i]) stak.pop();
        tree.upd(i + 1, stak.top().first - 1, 0, n - 1, 1, books[i]);
        // cout << (i + 1) << " " << (stak.top().first - 1) << endl;
        stak.push({i, books[i]});

        while (ptr >= 0 && queries[ptr][0] == i) {
            queries[ptr][4] = tree.qry(i, queries[ptr][1], 0, n - 1, 1);
            ptr--;
        }
    }
    sort(queries.begin(), queries.end(), [](const array<int, 5> &l, const array<int, 5> &r) {
        return l[3] < r[3];
    });
    for (int i = 0; i < q; i++) {
        cout << "01"[queries[i][4] <= queries[i][2]] << '\n';
        // cout << queries[i][4] << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...