Submission #884640

#TimeUsernameProblemLanguageResultExecution timeMemory
884640AndreiBOTOBall Machine (BOI13_ballmachine)C++14
100 / 100
143 ms79408 KiB
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

const int NMAX=5e5+5;

priority_queue<pair<int,int> , vector<pair<int,int>>, greater<pair<int,int>>>pq;
vector<int>v[NMAX];
int asc[25][NMAX];
bool viz[NMAX];
int dp[NMAX];
int ti[NMAX];
int to[NMAX];
int kon;

bool cmp(int x,int y)
{
    return dp[x]<dp[y];
}

void dfs1(int p,int tata)
{
    dp[p]=p;
    for(int i=1;i<=24;i++)
        asc[i][p]=asc[i-1][asc[i-1][p]];
    for(auto i:v[p])
    {
        if(i!=tata)
        {
            asc[0][i]=p;
            dfs1(i,p);
            dp[p]=min(dp[p],dp[i]);
        }
    }
}

void dfs2(int p,int tata)
{
    sort(v[p].begin(),v[p].end(),cmp);
    for(auto i:v[p])
    {
        if(i!=tata)
            dfs2(i,p);
    }
    to[p]=++kon;
}

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

    int n,q,i,j,root=-1;
    cin>>n>>q;
    for(i=1;i<=n;i++)
    {
        int x,y;
        cin>>x;
        if(x==0)
            root=i;
        else
        {
            v[x].push_back(i);
            v[i].push_back(x);
        }
    }
    dfs1(root,0);
    dfs2(root,0);
    for(i=1;i<=n;i++)
        pq.push(make_pair(to[i],i));
    while(q--)
    {
        int type,x;
        cin>>type>>x;
        if(type==1)
        {
            int best=-1;
            for(i=1;i<=x;i++)
            {
                int p=pq.top().second;
                pq.pop();
                best=p;
                viz[p]=true;
            }
            cout<<best<<"\n";
        }
        else
        {
            int kon=0;
            int p=x;
            for(int e=24;e>=0;e--)
                if(viz[asc[e][p]])
                {
                    kon+=(1<<e);
                    p=asc[e][p];
                }
            viz[p]=false;
            pq.push(make_pair(to[p],p));
            cout<<kon<<"\n";
        }
    }
    return 0;
}

Compilation message (stderr)

ballmachine.cpp:3: warning: ignoring '#pragma optimize GCC' [-Wunknown-pragmas]
    3 | #pragma optimize GCC ("Ofast")
      | 
ballmachine.cpp: In function 'int main()':
ballmachine.cpp:65:15: warning: unused variable 'y' [-Wunused-variable]
   65 |         int x,y;
      |               ^
ballmachine.cpp:61:15: warning: unused variable 'j' [-Wunused-variable]
   61 |     int n,q,i,j,root=-1;
      |               ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...