#include<stdio.h>
using namespace std;
const int N = 100005;
int vf[2 * N], lst[N], urm[2 * N], nr, n, m, ap[N];
bool viz[N];
const int PUTERE = 17, INF = 1 << 19;
int puteri[2 * N];
struct ptLCA
{
int adanc, euler;
};
ptLCA v[2 * N], rmq[PUTERE + 2][2 * N];
void adauga (int x, int y)
{
vf[++nr] = y;
urm[nr] = lst[x];
lst[x] = nr;
}
void dfs (int x, int adancime)
{
int y, p;
if (viz[x] == false)
{
ap[x] = ++nr;
viz[x] = true;
}
v[nr].euler = x;
v[nr].adanc = adancime;
p = lst[x];
while (p != 0)
{
y = vf[p];
if (viz[y] == false)
{
dfs (y, adancime + 1);
v[++nr].euler = x;
v[nr].adanc = adancime;
}
p = urm[p];
}
}
ptLCA minim (ptLCA a, ptLCA b)
{
if (a.adanc < b.adanc)
return a;
return b;
}
void construieste ()
{
int i, p = 1, j;
for (i = 1; i <= 2 * n - 1; i++)
{
rmq[0][i].adanc = v[i].adanc;
rmq[0][i].euler = v[i].euler;
}
for (i = 1; i <= PUTERE; i++)
{
for (j = 1; j <= 2 * n - 1; j++)
{
if (j + p <= 2 * n - 1)
rmq[i][j] = minim (rmq[i - 1][j], rmq[i - 1][j + p]);
}
p <<= 1;
}
p = 1;
for (i = 0; i <= PUTERE; i++)
{
puteri[p] = i;
p <<= 1;
}
}
int interog (int a, int b)
{
int p, val, dif;
ptLCA sol;
sol.adanc = INF;
while (a <= b)
{
dif = b - a + 1;
val = dif & (-dif);
p = puteri[val];
sol = minim (sol, rmq[p][a]);
a += val;
}
return sol.euler;
}
int main ()
{
FILE *in, *out;
in = fopen ("lca.in", "r");
out = fopen ("lca.out", "w");
fscanf (in, "%d%d", &n, &m);
int i, x;
for (i = 1; i <= n - 1; i++)
{
fscanf (in, "%d", &x);
adauga (x, i + 1);
adauga (i + 1, x);
}
nr = 0;
dfs (1, 0);
construieste();
int j;
int y, pozY, pozX;
for (i = 1; i <= m; i++)
{
fscanf (in, "%d%d", &x, &y);
pozY = ap[x];
pozX = ap[y];
if (pozX < pozY)
fprintf (out, "%d\n", interog (pozX, pozY));
else
fprintf (out, "%d\n", interog (pozY, pozX));
}
return 0;
}