제출 #992796

#제출 시각아이디문제언어결과실행 시간메모리
992796NValchanovHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
100 / 100
790 ms60452 KiB
#include <bits/stdc++.h>

#define endl '\n'

using namespace std;

typedef long long ll;

const int MAXN = 1e6 + 10;

struct SegmentTree
{
    int n;
    ll tree[4 * MAXN];
    ll w[MAXN];

    void init(int _n, ll _w[])
    {
        n = _n;
        for(int i = 1; i <= n; i++)
        {
            w[i] = _w[i];
        }
    }

    void update(int left, int right, int idx, int pos, ll val)
    {
        if(pos < left || right < pos)
            return;

        if(left == right)
        {
            tree[idx] = max(tree[idx], val + w[left]);
            return;
        }

        int mid = left + (right - left) / 2;

        update(left, mid, 2 * idx, pos, val);
        update(mid + 1, right, 2 * idx + 1, pos, val);

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

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

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

        int mid = left + (right - left) / 2;

        ll Lnode = query(left, mid, 2 * idx, qleft, qright);
        ll Rnode = query(mid + 1, right, 2 * idx + 1, qleft, qright);

        return max(Lnode, Rnode);
    }

    void update(int pos, ll val)
    {
        update(1, n, 1, pos, val);
    }

    ll query(int left, int right)
    {
        return query(1, n, 1, left, right);
    }
};

struct qry
{
    int left, right;
    ll k;
    int idx;

    qry()
    {
        left = right = 1;
        k = 0;
        idx = 1;
    }

    qry(int _left, int _right, ll _k, int _idx)
    {
        left = _left;
        right = _right;
        k = _k;
        idx = _idx;
    }

    friend bool operator<(const qry&q1, const qry&q2)
    {
        if(q1.right != q2.right)
            return q1.right < q2.right;

        if(q1.left != q2.left)
            return q1.left < q2.left;

        if(q1.k != q2.k)
            return q1.k < q2.k;
        
        return q1.idx < q2.idx;
    }
};

int n, q;
ll w[MAXN];
bool ans[MAXN];
vector < qry > queries;
SegmentTree t;

void read()
{
    cin >> n >> q;
    for(int i = 1; i <= n; i++)
    {
        cin >> w[i];
    }
    for(int i = 1; i <= q; i++)
    {
        int left, right;
        ll k;
        cin >> left >> right >> k;
        qry cur = qry(left, right, k, i);

        queries.push_back(cur);
    }
}

void solve()
{
    t.init(n, w);
    sort(queries.begin(), queries.end());

    stack < int > st;
    int ptr = 1;

    for(qry c : queries)
    {
        int left = c.left;
        int right = c.right;
        ll k = c.k;
        int idx =  c.idx;

        while(ptr <= right)
        {
            while(!st.empty() && w[st.top()] <= w[ptr])
                st.pop();

            if(!st.empty())
                t.update(st.top(), w[ptr]);

            st.push(ptr);

            ptr++;
        }

        ll cur = t.query(left, right);

        ans[idx] = (cur <= k);
    }
}

void print()
{
    for(int i = 1; i <= q; i++)
    {
        cout << ans[i] << endl;
    }
}

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

    read();
    solve();
    print();

    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...