#include <cstdio>
#include <vector>
using namespace std;
#define pb push_back
#define DIM 100005
int t[DIM], euler[DIM], grad[DIM], n, m, v[DIM], E, poz[DIM], M;
vector <int> F[DIM];
FILE *fout = fopen("lca.out", "w");
void _euler(int i, int gr)
{
grad[++E] = gr;
euler[E] = i;
v[i] = 1;
if (!poz[i])
poz[i] = E;
for (vector <int>::iterator it = F[i].begin(); it != F[i].end(); ++it)
if(!v[*it])
_euler(*it, gr+1), euler[++E] = i, grad[E] = gr;
}
int LCA(int x, int y)
{
int ibun = -1, st = poz[x], dr = poz[y];
if (dr < st) {int aux = dr; dr = st, st = aux;}
for (int i = st, min = 1<<30; i <= dr; ++i)
if (grad[i] < min)
min = grad[i], ibun = i;
return euler[ibun];
}
int main()
{
FILE *f = fopen("lca.in", "r");
fscanf(f, "%d%d", &n, &m);
for (int i = 2; i <= n; ++i)
fscanf(f, "%d", &t[i]), F[t[i]].pb(i);
M = m;
_euler(1, 0);/*
for (int i = 1; i <= E; ++i)
printf ("%2d ",i);
printf ("\n");
for (int i = 1; i <= E; ++i)
printf ("%2d ", euler[i]);
printf ("\n");
for (int i = 1; i <= E; ++i)
printf ("%2d ", grad[i]);
printf ("\n");
*/
for (int x, y; M; --M)
fscanf(f, "%d%d", &x, &y),fprintf (fout,"%d\n", LCA(x, y));
fclose(f);
fclose(fout);
return 0;
}