// #include <iostream>
// #include <fstream>
// #include <vector>
// std::ifstream fin("stramosi.in");
// std::ofstream fout("stramosi.out");
// int N,M,P,Q;
// int main(){
// fin >> N >> M;
// std::vector<int> parent(N + 1);
// int log = 0;
// while ( (1 << log) <= N){
// log++;
// }
// std::vector<std::vector<int>> up(N + 1, std::vector<int>(log));
// for ( int i = 1; i <= N; i++ ){
// fin >> parent[i];
// up[i][0] = parent[i];
// }
// for ( int i = 1; i < log; i++ ){
// for ( int node = 1; node <= N; node++ ){
// up[node][i] = up[up[node][i-1]][i-1];
// }
// }
// // for ( int i = 1; i <= N; i++ ){
// // for ( int j = 0; j < log; j++ ){
// // std::cout << up[i][j] << ' ';
// // }
// // std::cout << '\n';
// // }
// for ( int i = 0; i < M; i++ ){
// fin >> Q >> P;
// // for ( int j = 0; j < log; j++ ){
// // if ( P & (1<<j) ){
// // Q = up[Q][j];
// // if ( Q == 0 ){
// // break;
// // }
// // }
// // }
// // fout << Q << '\n';
// int p = 0;
// while(P){
// if ( P & 1 ){
// Q = up[Q][p];
// if ( Q == 0 ){
// break;
// }
// }
// P >>= 1;
// p++;
// }
// fout << Q << '\n';
// }
// return 0;
// }
#include <iostream>
#include <fstream>
#include <vector>
std::ifstream fin("stramosi.in");
std::ofstream fout("stramosi.out");
int main() {
int N, M;
fin >> N >> M;
int log = 0;
while ((1 << log) <= N) log++;
std::vector<std::vector<int>> up(N + 1, std::vector<int>(log, 0));
for (int i = 1; i <= N; i++) {
fin >> up[i][0];
}
for (int i = 1; i < log; i++) {
for (int node = 1; node <= N; node++) {
int ancestor = up[node][i-1];
if (ancestor != 0)
up[node][i] = up[ancestor][i-1];
else
up[node][i] = 0;
}
}
for (int i = 0; i < M; i++) {
int Q, P;
fin >> Q >> P;
int p = 0;
while (P && Q != 0) {
if (P & 1)
Q = up[Q][p];
P >>= 1;
p++;
}
fout << Q << '\n';
}
return 0;
}