Submission #1348458

#TimeUsernameProblemLanguageResultExecution timeMemory
1348458coin_Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
17 / 100
3101 ms327680 KiB
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;

const int maxn = 1e6 + 5;
const long long NEG = -(1LL << 60);

struct node {
    long long best;      // maximum a[i] + a[j] with i < j and a[i] > a[j]
    vector<long long> arr;  // sorted values in this segment

    node() {
        best = NEG;
    }

    node(long long b, vector<long long> ar) : best(b), arr(move(ar)) {}
} st[4 * maxn + 5];

node comb(const node &a, const node &b) {
    if (a.arr.empty()) return b;
    if (b.arr.empty()) return a;

    long long best = max(a.best, b.best);

    // cross inversion pairs: left value from a, right value from b
    long long cross = NEG;
    int j = 0, m = (int)b.arr.size();

    for (long long x : a.arr) {
        while (j < m && b.arr[j] < x) j++;
        if (j > 0) {
            cross = max(cross, x + b.arr[j - 1]);
        }
    }

    best = max(best, cross);

    // merge sorted arrays
    vector<long long> merged;
    merged.reserve(a.arr.size() + b.arr.size());

    int i = 0;
    j = 0;
    while (i < (int)a.arr.size() && j < (int)b.arr.size()) {
        if (a.arr[i] <= b.arr[j]) merged.push_back(a.arr[i++]);
        else merged.push_back(b.arr[j++]);
    }
    while (i < (int)a.arr.size()) merged.push_back(a.arr[i++]);
    while (j < (int)b.arr.size()) merged.push_back(b.arr[j++]);

    return node(best, move(merged));
}

void build(int id, int l, int r, vector<long long> &a) {
    if (l == r) {
        st[id] = node(NEG, vector<long long>{a[l]});
        return;
    }
    int mid = (l + r) / 2;
    build(id * 2, l, mid, a);
    build(id * 2 + 1, mid + 1, r, a);
    st[id] = comb(st[id * 2], st[id * 2 + 1]);
}

node get(int id, int l, int r, int ul, int ur) {
    if (l > ur || r < ul) return node(NEG, vector<long long>());
    if (ul <= l && r <= ur) return st[id];
    int mid = (l + r) / 2;
    return comb(get(id * 2, l, mid, ul, ur),
                get(id * 2 + 1, mid + 1, r, ul, ur));
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;

    vector<long long> bk(n + 1);
    for (int i = 1; i <= n; i++) cin >> bk[i];

    build(1, 1, n, bk);

    while (q--) {
        int u, v;
        long long k;
        cin >> u >> v >> k;

        node ans = get(1, 1, n, u, v);

        if (ans.best <= k) cout << 1 << endl;
        else cout << 0 << endl;
    }
}
#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...