#include <stdio.h>
#include <math.h>
#define MAXN 100000
#define MAXL 20
int tata[MAXN],euler[4 * MAXN],M2[MAXN][MAXL],level[4 * MAXN],poz[MAXN];
void euleer(int nod,int n,int*m){
int OK = 0, i;
++*m;
euler[*m] = nod;
level[*m] = level[*m - 1] + 1;
poz[nod] = *m;
for(i = 1;i <= n; ++i){
if(tata[i] == nod){
OK = 1;
euleer(i,n,m);
++*m;
euler[*m] = nod;
level[*m] = level[*m - 1] - 1;
}
}
}
void creare_rmq(int M2[MAXN][MAXL],int m){
int i, j;
for(i = 0;i < m; ++i)
M2[i][0] = i;
for(j = 1;(1 << j) <= m; ++j)
for(i = 0;i + (1 << j) - 1 < m; ++i)
if(euler[M2[i][j - 1]] < euler[M2[i + (1 << (j - 1))][j - 1]])
M2[i][j] = M2[i][j - 1];
else
M2[i][j] = M2[i + (1 << (j - 1))][j - 1];
}
int rezultat(int i,int j,int n,int M2[MAXN][MAXL]){
int k;
k = log2(j - i + 1);
return min(euler[M2[i][k]],euler[M2[j - (1 << k) + 1][k]]);
}
int min(int i,int j){
if(i > j)
return j;
return i;
}
int main(){
FILE *f, *g;
f=fopen("lca.in","r");
g=fopen("lca.out","w");
int n, m = 0, i, x, t,a ,b, nivel = 1, aux, j, c, d;
fscanf(f,"%d %d",&n,&t);
tata[1] = 0;
level[0] = -1;
for(i = 1;i < n; ++i)
fscanf(f,"%d",&tata[i + 1]);
euleer(1,n,&m);
creare_rmq(M2,m);
for(i = 1;i <= t; ++i){
fscanf(f,"%d %d",&a,&b);
c = poz[a];
d = poz[b];
if(c > d){
aux = c;
c = d;
d = aux;
}
fprintf(g,"%d\n",rezultat(c,d,m,M2));
}
return 0;
}