Submission #1179690

#TimeUsernameProblemLanguageResultExecution timeMemory
1179690alexddAbracadabra (CEOI22_abracadabra)C++17
0 / 100
1344 ms36256 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXT = 3e5;
const int INF = 1e8;
int n,q;
int a[200005],tori[200005],unde[200005];
int rez[1000005];
vector<pair<int,int>> qrys[MAXT+5];
vector<int> comp[200005];

set<int> roots;
int answer_qry(int poz)
{
    int pref=0;
    for(auto val_it:roots)
    {
        int it = unde[val_it];
        if(pref + tori[it] >= poz)
        {
            return a[it + (poz - pref) - 1];
        }
        pref += tori[it];
    }
    return -1;
    //assert(0);
}
void afis()
{
    for(auto it:roots) cout<<it<<" "<<tori[unde[it]]<<" roots\n";
    cout<<"\n\n\n";
}
signed main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>q;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        unde[a[i]] = i;
    }
    deque<int> dq;
    for(int i=n;i>0;i--)
    {
        while(!dq.empty() && a[i] > a[dq.back()])
            dq.pop_back();
        if(dq.empty())
            tori[i] = n+1 - i;
        else
            tori[i] = dq.back() - i;
        dq.push_back(i);
    }
    for(int i=1;i<=q;i++)
    {
        int t,poz;
        cin>>t>>poz;
        if(t==0)
        {
            rez[i] = a[poz];
        }
        else
        {
            t = min(t, MAXT);
            qrys[t].push_back({poz,i});
        }
    }
    int poz=1;
    while(poz<=n)
    {
        roots.insert(a[poz]);
        poz += tori[poz];
    }
    //afis();
    for(int t=1;t<=MAXT;t++)
    {
        int pref=0,mij=-1;
        bool perfectly_split=0;
        for(auto val_it:roots)
        {
            int it = unde[val_it];
            pref += tori[it];
            if(pref >= n/2)
            {
                if(pref==n/2)
                    perfectly_split=1;
                mij = it;
                break;
            }
        }
        assert(mij!=-1);
        if(perfectly_split)
        {
            for(int u=t;u<=MAXT;u++)
                for(auto [poz,id]:qrys[u])
                    rez[id] = answer_qry(poz);

            for(int i=1;i<=q;i++)
                cout<<rez[i]<<"\n";
            return 0;
        }

        int oldri = mij + tori[mij];
        tori[mij] = n/2 - (pref - tori[mij]);
        //cout<<a[mij]<<" "<<tori[mij]<<"  mij & newtori\n";
        int cur = mij + tori[mij];
        while(cur<oldri && a[cur] < a[mij])
        {
            roots.insert(a[cur]);
            //cout<<a[cur]<<" new root\n";
            cur += tori[cur];
        }

        for(auto [poz,id]:qrys[t])
            rez[id] = answer_qry(poz);

        //afis();

    }
    assert(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...