제출 #1306324

#제출 시각아이디문제언어결과실행 시간메모리
1306324domiHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
17 / 100
3102 ms189480 KiB
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

const int NMAX = 1e6;
const int VMAX = 2e9;
const int MAXNODES = 5e6;

using namespace std;

struct DynamicSeg {
    struct Node {
        int val = INT_MIN;
        Node *l, *r;
    };

    Node* root;
    Node pool[MAXNODES + 5];
    int ptr;

    Node* newNode() {
        return &pool[ptr++];
    }

    DynamicSeg() : root(nullptr) {}

    void update(int pos, int val, Node*& nod, int st = 0, int dr = VMAX) {
        if (!nod) nod = newNode();
        if (st == dr) {
            nod->val = val;
            return;
        }

        int m = (st + dr) >> 1;
        if (pos <= m)
            update(pos, val, nod->l, st, m);
        else
            update(pos, val, nod->r, m + 1, dr);

        nod->val = INT_MIN;
        if (nod->l) nod->val = max(nod->val, nod->l->val);
        if (nod->r) nod->val = max(nod->val, nod->r->val);
    }

    void update(int pos, int val) {
        update(pos, val, root);
    }

    int query(int l, int r, Node*& nod, int st = 0, int dr = VMAX) {
        if (!nod) return INT_MIN;
        if (l <= st && dr <= r) return nod->val;

        int m = (st + dr) >> 1;
        return max(query(l, r, nod->l, st, m), query(l, r, nod->r, m + 1, dr));
    }

    int query(int l, int r) {
        return query(l, r, root);
    }
};

vector<array<int, 3>>qu[NMAX + 5];
DynamicSeg aint;
int a[NMAX + 5], ans[NMAX + 5], n, q;

signed main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    cin >> n >> q;

    for (int i = 1; i <= n; ++i)
        cin >> a[i];

    for (int i = 1, l, r, k; i <= q; ++i) {
        cin >> l >> r >> k;
        qu[r].push_back({l, k, i});
    }

    stack<int>st;
    for (int i = 1; i <= n; ++i) {
        while (!st.empty() && a[i] >= a[st.top()])
            st.pop();

        int x = (st.empty() ? 0 : st.top());
        aint.update(x, a[i] + a[x]);
        st.push(i);
        for (auto &[l, k, idx] : qu[i])
            ans[idx] = (aint.query(l, n) <= k);
    }

    for (int i = 1; i <= q; ++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...