// complexitate O(N * log(N)) pentru precalculare
// complexitate O(log(N)) pentru fiecare interogare
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;
const int MAXN = 250005;
const int LOG = 19;
int up[MAXN][LOG];
// up[node][j] = al 2**j-lea strămoș al node-ului
// up[5][0] = strămoșul direct
// up[5][1] = strămoșul la 2 pași
// up[5][2] = strămoșul la 4 pași
// ......
int main() {
ifstream fin("stramosi.in");
ofstream fout("stramosi.out");
int N, M;
fin >> N >> M;
for (int i = 1; i <= N; i++) {
fin >> up[i][0]; // părintele direct
}
// Precalculare pentru fiecare 2^j
for (int j = 1; j < LOG; j++) {
for (int i = 1; i <= N; i++) {
if (up[i][j - 1] != 0)
up[i][j] = up[up[i][j - 1]][j - 1];
else
up[i][j] = 0;
}
}
for (int i = 0; i < M; i++) {
int node, p;
fin >> node >> p;
// p in binar si sarim prin bitii de 1, daca bitul i e setat, sarim 2^i pasi in sus
for (int j = 0; j < LOG; j++) {
if (p & (1 << j)) {
node = up[node][j];
if (node == 0)
break;
}
}
fout << node << '\n';
}
return 0;
}