Submission #621299

#TimeUsernameProblemLanguageResultExecution timeMemory
621299353ceregaBall Machine (BOI13_ballmachine)C++17
100 / 100
424 ms46360 KiB
#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>


using namespace std;


using ll = long long;
using ld = long double;

#define X first
#define Y second

//const ll mod = 1000000007;
const ll mod = 998244353;

vector<vector<ll>> g, up;
vector<ll> mn;
ll K = 20;

void dfs0(ll u)
{
    mn[u] = u;
    for (ll j=1;j<K;j++)
    {
        up[u][j] = up[up[u][j-1]][j-1];
    }
    for (ll v: g[u])
    {
        dfs0(v);
        mn[u] = min(mn[u],mn[v]);
    }
}

vector<ll> Q;

void dfs(ll u)
{
    vector<pair<ll,ll>> ord;
    for (ll v: g[u])
    {
        ord.push_back({mn[v],v});
    }
    sort(ord.begin(),ord.end());
    for (auto x: ord) dfs(x.Y);
    Q.push_back(u);
}

void solve()
{
    ll n, q;
    cin >> n >> q;
    g.resize(n+1);
    mn.resize(n+1);
    up.resize(n+1,vector<ll>(K));
    for (ll i=1;i<=n;i++)
    {
        ll x;
        cin >> x;
        up[i][0] = x;
        g[x].push_back(i);
    }
    dfs0(0);
    dfs(0);
    vector<ll> Q2(n+1);
    for (ll i=0;i<=n;i++) Q2[Q[i]] = i;
    set<ll> kek;
    for (ll i=0;i<=n;i++) kek.insert(i);
    vector<ll> was(n+1);
    while (q--)
    {
        ll t;
        ll x;
        cin >> t >> x;
        if (t==1)
        {
            ll L = 0;
            while (x--)
            {
                L = *kek.begin();
                kek.erase(L);
                was[Q[L]] = 1;
            }
            cout << Q[L] << "\n";
            continue;
        }
        ll A = 0;
        for (ll j=K-1;j>=0;j--)
        {
            if (was[up[x][j]]==1)
            {
                A += (1LL<<j);
                x = up[x][j];
            }
        }
        cout << A << "\n";
        was[x] = 0;
        kek.insert(Q2[x]);
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    ll T;
    T = 1;
    //cin >> T;
    while (T--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...