#include <fstream>
#include <vector>
using namespace std;
ifstream in("stramosi.in");
ofstream out("stramosi.out");
const int MAXN = 250005;
const int MAXM = 300003;
int n,m;
struct intrebare
{
int id;
int p;
};
vector<intrebare> intrebarinod[MAXN];
vector<int> fii[MAXN];
vector<int> radacini;
void citire()
{
in >> n >> m;
for (int i = 1;i <= n;++i)
{
int tata;
in >> tata;
if (tata == 0)
radacini.push_back(i);
else fii[tata].push_back(i);
}
for (int i = 1;i <= m;++i)
{
int p,q;
in >> q >> p;
intrebarinod[q].push_back((intrebare){i,p});
}
}
int stiva[MAXN];
int indice_fiu[MAXN];
int l_stiva;
int rasp_intrebari[MAXM];
void dfs(int radacina)
{
stiva[l_stiva = 1] = radacina;
while(l_stiva >= 1)
{
int nod = stiva[l_stiva];
if (indice_fiu[nod] == -1)//nu am calculat intrebarile lui nod
for (unsigned int i = 0;i < intrebarinod[nod].size();++i)
{
int id = intrebarinod[nod][i].id;
int p = intrebarinod[nod][i].p;
if (l_stiva - p < 1)
rasp_intrebari[id] = 0;
else rasp_intrebari[id] = stiva[l_stiva - p];
}
++indice_fiu[nod];
if (indice_fiu[nod] < fii[nod].size())
stiva[++l_stiva] = fii[nod][indice_fiu[nod]];
else --l_stiva;
}
}
void afisare()
{
for (int i = 1;i <= m;++i)
out << rasp_intrebari[i] << '\n';
}
int main()
{
citire();
for (int i = 1;i <= n;++i)
indice_fiu[i] = -1;
for (unsigned int i = 0;i < radacini.size();++i)
dfs(radacini[i]);
afisare();
return 0;
}