Cod sursa(job #3297020)

Utilizator petru-robuRobu Petru petru-robu Data 20 mai 2025 12:36:44
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <bits/stdc++.h>
using namespace std;

#define N 250008

ifstream fin("stramosi.in");
ofstream fout("stramosi.out");

int n, m, parent[N];
vector<int> graf[N];

int up[N][19]; //for binary lifting

void read()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        fin >> parent[i];
        if(parent[i] != 0)
            graf[parent[i]].push_back(i);
    }
}

void dfs(int nod)
{
    for(auto &vec:graf[nod])
    {
        up[vec][0] = nod;
        for(int j=1; (1<<j) <= n; j++) //compute ancestors for pow of 2
            up[vec][j] = up[ up[vec][j-1] ][j-1];
        dfs(vec);
    }   
}

void solve()
{
    for(int i=1; i<=n; i++)
        if(!parent[i])
            dfs(i);

    while(m--)
    {
        int nod, k;
        fin>>nod>>k;

        for(int i=19; i>=0; i--)
        {
            if( (1<<i) & k ) //has i-th bit set
                nod = up[nod][i];
        }

        fout<<nod<<"\n";
    }
}

int main()
{
    read();
    solve();
    return 0;
}