#include <cstdio>
#include <vector>
using namespace std;
#define IN "lca.in"
#define OUT "lca.out"
#define l 100003
#define pb push_back
int n , m , lg;
vector<int>G[l];
int E[l<<2] , F[l<<2] , loga[l<<2];
int rmq[18][l<<2];
void Read()
{
int i , x;
scanf ( "%d%d" , &n , &m );
for ( i = 2 ; i <= n ; i ++ )
scanf ( "%d" , &x ) , G[x].pb(i);
}
void Euler_Tour(int nod) {
int i;
E[++lg] = nod;
F[nod] = lg;
for ( i = 0 ; i < G[nod].size() ; i ++ ) {
Euler_Tour(G[nod][i]);
E[++lg]=nod;
}
}
void RMQ()
{
int i , j , t;
for ( i = 1 ; i <= lg ; i ++ ){
rmq[0][i] = level[i];
if ( i > 1)
loga[i] = loga[i/2]+1;
}
t = loga[lg];
for ( i = 1 ; i <= t ; i ++ )
for ( j = 1 ; j+(1<<(i-1)) < lg ; j ++ )
rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
}
void Solve()
{
int i , x , y , a , b , d;
for ( i = 1 ; i <= m ; i ++ ){
scanf ( "%d%d" , &a , &b );
x = min(F[a],F[b]) , y = max(F[a],F[b]);
d = loga[y-x+1];
printf ( "%d\n" , min(rmq[d][x],rmq[d][y-(1<<d)+1]));
}
}
int main()
{
freopen(IN , "r" , stdin);
freopen(OUT , "w" , stdout);
Read();
Euler_Tour(1);
RMQ();
Solve();
}