Cod sursa(job #3265974)

Utilizator CarenaMironov Cezar Luca Carena Data 4 ianuarie 2025 16:45:26
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.8 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("stramosi.in");
ofstream cout("stramosi.out");

const int NMAX=25e4+5;
int p[NMAX], lift[NMAX][18];
vector<int> adj[NMAX];

void DFS(int u)
{
    lift[u][0]=p[u];
    for(int i=1;i<=17;i++)
        lift[u][i]=lift[lift[u][i-1]][i-1];
    for(auto v:adj[u])
        DFS(v);
}

int caut_bin(int u, int k)
{
    int r=u, pas=17;
    while(pas>=0)
    {
        if(k&(1<<pas))
            r=lift[r][pas];
        pas--;
    }
    return r;
}

int main()
{
    int n, m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i];
        adj[p[i]].push_back(i);
    }
    DFS(0);
    while(m--)
    {
        int u, k;
        cin>>u>>k;
        cout<<caut_bin(u, k)<<'\n';
    }
    return 0;
}