Cod sursa(job #3155793)

Utilizator vladutzu_finutzuVlad Cacenschi vladutzu_finutzu Data 9 octombrie 2023 18:35:38
Problema Stramosi Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.03 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("stramosi.in");
ofstream cout("stramosi.out");
int n, q;
vector<vector<int>> dp, children;
vector<int> D;
void dfs(int nod, int depth){
    if(nod){
        int p=2;
        for(int k=1; p<=depth; k++){
            dp[nod][k] = dp[dp[nod][k-1]][k-1];
            p *= 2;
        }
    }

    D[nod] = depth;

    for(int child:children[nod])
        dfs(child, depth+1);
}
int level(int x, int l){
    int sol = x;
    int k=0;

    while(l and sol){
        if(l % 2)
            sol = dp[sol][k];
        
        l /= 2;
        k++;
    }

    return sol;
}
int main(){
    cin>>n>>q;
    dp.resize(n+1, vector<int>(20, -1));
    children.resize(n+1);
    D.resize(n+1);

    for(int i=1; i<=n; i++){
        cin>>dp[i][0];
        children[dp[i][0]].push_back(i);
    }
    
    dfs(0, 0);
    // cout<<level(5, 2);
    while(q--){
        int a, b;
        cin>>a>>b;
        cout<<level(a, b)<<"\n";
    }
    return 0;
}