Pagini recente » Cod sursa (job #1157015) | Cod sursa (job #2588703) | Cod sursa (job #2874125) | Cod sursa (job #39055) | Cod sursa (job #3155793)
#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;
}