Submission #502684

#TimeUsernameProblemLanguageResultExecution timeMemory
502684timHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
64 / 100
3070 ms247216 KiB
#include <bits/stdc++.h>

#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define y1 tim
#define endl "\n"

#define sz(x) (long long)(x).size()
#define all(x) (x).begin(), (x).end()

using namespace std;

mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count());

int w[1000010], mx[4000010], ans[4000010], Max, y, l, r, k, n, m;
vector <int> v[4000010];

void build (int l, int r, int x)
{
    if (r < l) return;
    if (l == r)
    {
        mx[x] = w[l];
        v[x].push_back(w[l]);
        ans[x] = 0;
        return;
    }
    build (l, (l + r) / 2, x * 2);
    build ((l + r) / 2 + 1, r, x * 2 + 1);
    mx[x] = max (mx[x * 2], mx[x * 2 + 1]);
    v[x] = v[x * 2];
    ans[x] = max (ans[x * 2], ans[x * 2 + 1]);
    int mx1 = -1;
    for (int i = 0; i < v[x * 2 + 1].size(); i++)
    {

        if (v[x * 2 + 1][i] < mx[x * 2]) mx1 = v[x * 2 + 1][i];
        v[x].push_back(v[x * 2 + 1][i]);
    }
    sort (v[x].begin(), v[x].end());
    if (mx1 != -1) ans[x] = max (ans[x], mx[x * 2] + mx1);
}

void get (int l, int r, int tl, int tr, int x)
{
    if (r < l) return;
    if (tl > r) return;
    if (tr < l) return;
    tl = max (l, tl);
    tr = min (r, tr);
    if (l == tl and r == tr)
    {
        if (Max == 0 and y == 0)
        {
            y = ans[x];
            Max = mx[x];
        }
        else
        {
            y = max (y, ans[x]);
            int pos = lower_bound(v[x].begin(), v[x].end(), Max) - v[x].begin();
            if (pos != 0)
            {
                pos--;
                y = max (y, Max + v[x][pos]);
            }
            Max = max (Max, mx[x]);
        }
        return;
    }
    get (l, (l + r) / 2, tl, tr, x * 2);
    get ((l + r) / 2 + 1, r, tl, tr, x * 2 + 1);
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> w[i];
    build (1, n, 1);
    for (int i = 1; i <= m; i++)
    {
        cin >> l >> r >> k;
        y = 0;
        Max = 0;
        get (1, n, l, r, 1);
        if (y <= k) cout << 1 << endl;
        else cout << 0 << endl;
    }
    return 0;
}

Compilation message (stderr)

sortbooks.cpp: In function 'void build(int, int, int)':
sortbooks.cpp:36:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   36 |     for (int i = 0; i < v[x * 2 + 1].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...