#include <bits/stdc++.h>
#define maxV 250005
std::ifstream fin("stramosi.in");
std::ofstream fout("stramosi.out");
std::vector <std::vector <int>> parent;
std::vector <int> roots;
std::vector <int> edge[maxV];
int main() {
int V, Q;
fin >> V >> Q;
parent.resize(V + 1);
for(int i = 0; i <= V; i ++)
parent[i].resize(20);
for(int i = 1; i <= V; i ++) {
fin >> parent[i][0];
if(parent[i][0] == 0) {
roots.push_back(i);
}
}
for(int step = 1, p2 = 1; p2 < V; step ++, p2 <<= 1) {
for(int i = 1; i <= V; i ++) {
int prev1 = parent[i][step-1];
int prev2 = parent[prev1][step-1];
if(prev1 and prev2)
parent[i][step] = prev2;
}
}
while(Q --) {
int node, k;
fin >> node >> k;
for(int i = 0; (1 << i) <= k and node; i ++) {
if((k & (1<<i)) != 0) {
node = parent[node][i];
}
}
fout << node << '\n';
}
return 0;
}