Submission #1326522

#TimeUsernameProblemLanguageResultExecution timeMemory
1326522gustavo_dHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
977 ms64580 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 1e6;

int arr[MAXN], leftBigger[MAXN];
bool ans[MAXN];
vector<tuple<int, int, int>> queries[MAXN];

struct Node {
    int mx;

    Node (int _mx=0): mx(_mx) {}

    Node operator+(Node right) {
        Node left = *this;
        return Node(max(left.mx, right.mx));
    }
};

struct Seg {
    vector<Node> seg; int n;

    Seg (int _n=0) {
        n = 1;
        while (n < _n) n <<= 1;
        seg = vector<Node> (2*n);
    }

    int getLeft(int v) {
        return 2*v;
    }

    int getRight(int v) {
        return 2*v+1;
    }

    void put(int v, int l, int r, int i, int x) {
        if (l == r) {
            seg[v].mx = max(seg[v].mx, x);
            return;
        }
        int m = (l + r) / 2;
        if (i <= m) put(getLeft(v), l, m, i, x);
        else put(getRight(v), m+1, r, i, x);
        seg[v] = seg[getLeft(v)] + seg[getRight(v)];
    }

    Node rng(int v, int l, int r, int a, int b) {
        if (a <= l and r <= b) return seg[v];
        if (r < a or b < l) return Node();
        int m = (l + r) / 2;
        return rng(getLeft(v), l, m, a, b) + rng(getRight(v), m+1, r, a, b);
    }
};

int main() {
    cin.tie(0)->sync_with_stdio(false);

    int n, qs; cin >> n >> qs;
    vector<int> st;
    for (int i=0; i<n; i++) {
        cin >> arr[i];
        while (!st.empty() and arr[st.back()] <= arr[i])
            st.pop_back();
        leftBigger[i] = (st.empty() ? -1 : st.back());
        st.push_back(i);
    }

    for (int q=0; q<qs; q++) {
        int l, r, x; cin >> l >> r >> x; l--; r--;
        queries[r].emplace_back(l, x, q);
    }

    Seg seg(n);
    for (int r=0; r<n; r++) {
        if (leftBigger[r] != -1) {
            int pos = leftBigger[r];
            seg.put(1, 0, seg.n-1, pos, arr[r] + arr[pos]);
        }
        for (auto [l, x, q] : queries[r]) {
            // cerr << q << ' ' << seg.rng(1, 0, seg.n-1, l, r).mx << '\n';
            ans[q] = seg.rng(1, 0, seg.n-1, l, r).mx <= x;
        }
    }

    for (int i=0; i<qs; i++) cout << ans[i] << '\n';

    return 0;
}
#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...