제출 #992771

#제출 시각아이디문제언어결과실행 시간메모리
992771danikoynovHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++14
100 / 100
1070 ms131292 KiB
#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 1e6 + 10;

int n, m, w[maxn];

int tree[4 * maxn];

void update(int root, int left, int right, int pivot, int val)
{
    if (left == right)
    {
        tree[root] = max(tree[root] , val);
        return;
    }

    int mid = (left + right) / 2;
    if (pivot <= mid)
        update(root * 2, left, mid, pivot, val);
    else
        update(root * 2 + 1, mid + 1, right, pivot, val);


    tree[root] = max(tree[root * 2], tree[root * 2 + 1]);
}

int query(int root, int left, int right, int qleft, int qright)
{
    if (left > qright || right < qleft)
    return 0;

    if (left >= qleft && right <= qright)
        return tree[root];

    int mid = (left + right) / 2;
    return max(query(root * 2, left, mid, qleft, qright),
               query(root * 2 + 1, mid + 1, right, qleft, qright));
}

vector < pair < int, int > > spot[maxn];

struct query_data
{
    int idx, r, k;
};

int ans[maxn];
vector < query_data > task[maxn];

void solve()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i ++)
    {
        cin >> w[i];
    }

    stack < int > st;
    vector < pair < int, int > > fun;


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

        if (!st.empty())
        {
            fun.push_back({st.top(), i});
        }
        st.push(i);

    }

    for (pair < int, int > cur : fun)
    {
        spot[cur.first].push_back({cur.second, w[cur.first] + w[cur.second]});
    }

    for (int i = 1; i <= m; i ++)
    {
        query_data cur;
        int sp;
        cin >> sp >> cur.r >> cur.k;
        cur.idx = i;
        task[sp].push_back(cur);
    }

    for (int i = n; i > 0; i --)
    {
        for (pair < int, int > cur : spot[i])
        {
            update(1, 1, n, cur.first, cur.second);
        }

        for (query_data cur : task[i])
        {
            int mx = query(1, 1, n, i, cur.r);
            ans[cur.idx] = (mx <= cur.k);
        }
    }



    for (int i = 1; i <= m; i ++)
        cout << ans[i] << endl;
}

int main()
{
    speed();
    solve();
    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...