Submission #330783

#TimeUsernameProblemLanguageResultExecution timeMemory
330783vitkishloh228Hedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
34 / 100
645 ms262148 KiB
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("fast-math")
#pragma GCC optimize("vpt")
vector<vector<int>> t;
vector<int> mx, ans, a;
void build(int v, int l, int r) {
    if (l == r) {
        t[v] = { a[l] };
        mx[v] = a[l];
        ans[v] = 0;
        return;
    }
    int m = (l + r) >> 1;
    build(2 * v, l, m);
    build(2 * v + 1, m + 1, r);
    t[v].resize(t[2 * v].size() + t[2 * v + 1].size());
    merge(t[2 * v].begin(), t[2 * v].end(), t[2 * v + 1].begin(), t[2 * v + 1].end(), t[v].begin());
    ans[v] = max(ans[2 * v], ans[2 * v + 1]);
    mx[v] = max(mx[2 * v], mx[2 * v + 1]);
    int pos1 = lower_bound(t[2 * v + 1].begin(), t[2 * v + 1].end(), mx[2 * v]) - t[2 * v + 1].begin();
    pos1--;
    if (pos1 >= 0) {
        ans[v] = max(ans[v], mx[2 * v] + t[2 * v + 1][pos1]);
    }
}
void get(int v, int tl, int tr, int l, int r, vector<int>& vert) {
    if (tl > tr || l > r) return;
    if (tl == l && tr == r) {
        vert.push_back(v);
        return;
    }
    int tm = (tl + tr) >> 1;
    get(2 * v, tl, tm, l, min(r, tm), vert);
    get(2 * v + 1, tm + 1, tr, max(l, tm + 1), r, vert);
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n, q;
    cin >> n >> q;
    t.resize(4 * n);
    a.resize(n);
    mx.resize(4 * n);
    ans.resize(4 * n);
    int min1 = 1e9;
    for (int& i : a) {
        cin >> i;
        min1 = min(min1, i);
    }
    build(1, 0, n - 1);
    vector<int> pr(n + 1);
    for (int i = 0; i < n; ++i) {
        if (i == 0 || a[i] > a[i - 1]) {
            pr[i + 1] = 1 + pr[i];
        }
        else {
            pr[i + 1] = pr[i];
        }
    }
    while (q--) {
        int l, r, c;
        cin >> l >> r >> c;
        --l, --r;
        if (c < min1) {
            if (pr[r + 1] - pr[l] >= r - l) {
                cout << "1\n";
            }
            else {
                cout << "0\n";
            }
            continue;
        }
        vector<int> vert;
        get(1, 0, n - 1, l, r, vert);
        int x = 0;
        for (auto v : vert) {
            x = max(x, ans[v]);
        }
        int curmax = t[vert[0]].back();
        for (int i = 1; i < vert.size(); ++i) {
            int v = vert[i];
            int pos1 = lower_bound(t[v].begin(), t[v].end(), curmax) - t[v].begin();
            pos1--;
            if (pos1 >= 0) {
                x = max(x, curmax + t[v][pos1]);
            }
            curmax = max(curmax, t[v].back());
        }
        if (x <= c) {
            cout << "1\n";
        }
        else cout << "0\n";
    }
}

Compilation message (stderr)

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:87:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   87 |         for (int i = 1; i < vert.size(); ++i) {
      |                         ~~^~~~~~~~~~~~~
#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...