Cod sursa(job #3355804)

Utilizator andrei22116Popescu Stefan Andrei andrei22116 Data 26 mai 2026 11:04:29
Problema Stramosi Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <bits/stdc++.h>

using namespace std;

const int nm=300000;
int jmp[20][nm+5],tt[nm];
int d[nm];
vector<int>adj[nm];
int lca(int a, int b){
    if(d[a]<d[b]){
        swap(a,b);
    }
    for(int i=19;i>-1;--i){
        if(d[jmp[i][a]]>=d[b])a=jmp[i][a];

    }
    if(a==b)return a;
    for(int i=19;i>=0;--i)
        if(jmp[i][a]!=jmp[i][b])
        {
            a=jmp[i][a];
            b=jmp[i][b];
        }
    return tt[a];
}
void dfs(int nod){
    for(auto it:adj[nod]){
        d[it]=d[nod]+1;
        dfs(it);
    }
    return;
}
int main()
{
    ifstream cin("stramosi.in");
    ofstream cout("stramosi.out");
    int n,m;
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> tt[i];
    }
    for (int i = 1; i <= n; i++) {
        if (tt[i] != 0) {
            int p = tt[i];
            adj[p].push_back(i);
        }
    }
    for(int i=1;i<=n;i++){
        jmp[0][i]=tt[i];
    }
    for(int i=1;i<20;i++){
        for(int j=1;j<=n;j++){
            jmp[i][j]=jmp[i-1][jmp[i-1][j]];
        }
    }
    dfs(1);
    for(int i=1;i<=m;i++){
        int a,b;
        cin >> a >> b;
        int nod=a;
        for(int j=19;j>=0;j--)
        {
            if((1<<j)<=b)
            {
                nod=jmp[j][nod];
                b-=(1<<j);
            }
        }
        cout << nod << '\n';
    }

    return 0;
}