Submission #1307344

#TimeUsernameProblemLanguageResultExecution timeMemory
1307344simona1230Abracadabra (CEOI22_abracadabra)C++20
100 / 100
1213 ms47596 KiB
#include <bits/stdc++.h>

using namespace std;
const int maxn=1e6+5;

int n,q;
int a[maxn];

int t[maxn],x[maxn];
vector<int> v[maxn];
int ans[maxn];
int op[maxn];

void read()
{
    cin>>n>>q;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
        op[a[i]]=i;
    }

    for(int i=1; i<=q; i++)
    {
        cin>>t[i]>>x[i];
        v[min(n,t[i])].push_back(i);
        if(t[i]==0)ans[i]=a[x[i]];
    }
}

struct group
{
    int id;
    group() {}
    group(int _id)
    {
        id=_id;
    }

    bool operator<(const group&g)const
    {
        return a[id]<a[g.id];
    }
};

set<group> s;
int sz[maxn],nxt[maxn];
int tr[800001];
void upd(int i,int l,int r,int id,int vl)
{
    if(l==r)
    {
        //cout<<"in "<<l<<" "<<vl<<endl;
        tr[i]=vl;
        return;
    }

    int m=(l+r)/2;
    if(id<=m)upd(i*2,l,m,id,vl);
    else upd(i*2+1,m+1,r,id,vl);

    tr[i]=tr[i*2]+tr[i*2+1];
}

pair<int,int> query(int i,int l,int r,int x,int bf)
{
    if(l==r)return {bf+tr[i],l};
    int m=(l+r)/2;
    if(tr[i*2]>=x)return query(i*2,l,m,x,bf);
    return query(i*2+1,m+1,r,x-tr[i*2],bf+tr[i*2]);
}

void prec()
{
    stack<int> h;
    for(int i=n; i>=1; i--)
    {
        while(h.size()&&a[h.top()]<a[i])h.pop();
        if(h.size())nxt[i]=h.top();
        else nxt[i]=n+1;
        h.push(i);
    }

    int i=1;
    while(i<=n)
    {
        sz[i]=nxt[i]-i;
        upd(1,1,n,a[i],sz[i]);
        s.insert({i});
        i=nxt[i];
    }
}



void solve()
{
    int br=-1;
    int cnt=0;
    auto it=s.begin();

    while(cnt<n/2)
    {
        cnt+=sz[it->id];
        if(cnt>n/2)br=it->id;
        else if(cnt<n/2)it++;
    }

    if(br==-1)
    {
        for(int lp=1;lp<=n;lp++)
        {
            for(int i=0; i<v[lp].size(); i++)
            {
                int idx=x[v[lp][i]];
                pair<int,int> h=query(1,1,n,idx,0);
                //cout<<idx<<" ? "<<h.first<<" "<<op[h.second]<<" "<<sz[op[h.second]]<<endl;
                ans[v[lp][i]]=a[op[h.second]+sz[op[h.second]]-1-(h.first-idx)];
            }
        }
    }

    //cout<<"here"<<endl;

    /*for(int i=1;i<=n;i++)
        cout<<nxt[i]<<endl;
    cout<<endl;*/
    int lp=0;
    while(br!=-1)
    {
        lp++;

        it=s.find({br});
        group g=*it;
        int rt=br+sz[br];

        int bf=cnt-sz[g.id];
        int nid=n/2-bf+g.id;

        while(nid<rt)
        {
            sz[nid]=min(rt,nxt[nid])-nid;
            upd(1,1,n,a[nid],sz[nid]);
            s.insert({nid});
            nid=nxt[nid];
        }

        s.erase({br});
        sz[br]=n/2-bf;
        upd(1,1,n,a[br],sz[br]);
        s.insert({br});

        it=s.find(br);

        while(cnt>n/2)
        {
            cnt-=sz[it->id];
            if(cnt==n/2)br=-1;
            else if(cnt<n/2)br=it->id;
            else it--;
        }

        for(int i=0; i<v[lp].size(); i++)
        {
            int idx=x[v[lp][i]];
            pair<int,int> h=query(1,1,n,idx,0);
            //cout<<idx<<" ? "<<h.first<<" "<<op[h.second]<<" "<<sz[op[h.second]]<<endl;
            ans[v[lp][i]]=a[op[h.second]+sz[op[h.second]]-1-(h.first-idx)];
        }

        if(br!=-1)cnt+=sz[br];
        else
        {
            while(lp<n)
            {
                lp++;
                for(int i=0; i<v[lp].size(); i++)
                {
                    int idx=x[v[lp][i]];
                    pair<int,int> h=query(1,1,n,idx,0);
                    //cout<<idx<<" ? "<<h.first<<" "<<op[h.second]<<" "<<sz[op[h.second]]<<endl;
                    ans[v[lp][i]]=a[op[h.second]+sz[op[h.second]]-1-(h.first-idx)];
                }
            }
        }
    }

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

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    read();
    prec();
    solve();
    return 0;
}

/*
10 0
3 2 7 5 4 6 1 8 9 10
*/

/*
8 8
5 2 7 3 1 6 8 4
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8

8 8
5 2 7 3 1 6 8 4
3 1
1
3 2
6
3 3
5
3 4
2
3 5
7
3 6
3
3 7
8
3 8
4

10 10
3 2 5 1 8 9 10 4 7 6
3 1
3 2
3 3
3 4
3 5
3 6
3 7
3 8
3 9
3 10
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...