Submission #227894

#TimeUsernameProblemLanguageResultExecution timeMemory
227894emil_physmathHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
841 ms262148 KiB
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

int a[1000'000];
vector<int> t[4000'000];
int tans[4000'000];
int ans[1000'000];
int w[1000'000];

inline int Max(const vector<int>& x) { return x.back(); }
void Build(int v, int vl, int vr)
{
    if (vl == vr)
    {
        ans[v] = 0;
        t[v].push_back(a[vr]);
        return;
    }
    int m = vl + (vr - vl) / 2;
    Build(v * 2, vl, m);
    Build(v * 2 + 1, m + 1, vr);
    t[v].reserve(vr - vl + 1);
    merge(t[v * 2].begin(), t[v * 2].end(),
          t[v * 2 + 1].begin(), t[v * 2 + 1].end(),
          back_inserter(t[v]));
    t[v].shrink_to_fit();
    tans[v] = max(tans[v * 2], tans[v * 2 + 1]);
    auto smaller = lower_bound(t[v * 2 + 1].begin(), t[v * 2 + 1].end(), Max(t[v * 2]));
    if (smaller != t[v * 2 + 1].begin())
        tans[v] = max(tans[v], Max(t[v * 2]) + *--smaller);
}
struct UPD
{
    int v, maxAtLeft, q;
};
vector<UPD> upd;
int Query(int v, int vl, int vr, int l, int r, int maxAtLeft, int q)
{
    if (l > vr || vl > r)
        return 0;
    if (l <= vl && vr <= r)
    {
        ans[q] = max(ans[q], tans[v]);
        upd.push_back(UPD());
        upd.back().v = v;
        upd.back().maxAtLeft = maxAtLeft;
        upd.back().q = q;
        return Max(t[v]);
    }
    int vm = vl + (vr - vl) / 2;
    maxAtLeft = max(Query(v * 2, vl, vm, l, r, maxAtLeft, q), maxAtLeft);
    Query(v * 2 + 1, vm + 1, vr, l, r, maxAtLeft, q);
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; ++i)
        cin >> a[i];
    Build(1, 0, n - 1);
    for (int i = 0; i < m; ++i)
    {
        ans[i] = 0;
        int l, r;
        cin >> l >> r >> w[i];
        --l; --r;
        Query(1, 0, n - 1, l, r, 0, i);
    }
    for (UPD x: upd)
    {
        int v = x.v, maxAtLeft = x.maxAtLeft, q = x.q;
        auto small = lower_bound(t[v].begin(), t[v].end(), maxAtLeft);
        if (small != t[v].begin())
            ans[q] = max(ans[q], maxAtLeft + *--small);
    }
    for (int i = 0; i < m; ++i)
        cout << (ans[i] <= w[i]) << '\n';
}

Compilation message (stderr)

sortbooks.cpp: In function 'int Query(int, int, int, int, int, int, int)':
sortbooks.cpp:55:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...