#include <stdio.h>
#include <vector>
#define oo 9999999
#define Min(a,b) (a<b ? a:b)
#include <algorithm>
using namespace std;
FILE *f,*g;
int Rank[100010],Poz[100010],log[200010];
int N,M;
vector <int> graf[100010];
int ss[3];
int RMQ[45][2*100010];
void DFS(int Node)
{
int i,T=graf[Node].size(),vecin;
RMQ[0][++N]=Node;
if(!Poz[Node])Poz[Node]=N;
for(i=0;i<T;++i)
{
vecin=graf[Node][i];
if(!Rank[vecin])
{
Rank[vecin]=Rank[Node]+1;
DFS(vecin);
RMQ[0][++N]=Node;
}
}
}
void Update(int i,int j,int A,int B)
{
if(Rank[A]<Rank[B])RMQ[i][j]=A;
else RMQ[i][j]=B;
}
void CreateRMQ()
{
int i,j,A,B;
for(i=2;i<=N;++i)log[i]=log[i/2]+1;
for(i=1;i<=log[N];++i)
for(j=1;j+(1<<i-1)<=N+1;++j)
{
A=RMQ[i-1][j],B=RMQ[i-1][j+(1<<i-1)];
Update(i,j,A,B);
}
}
void Read()
{
int i,X,Y;
fscanf(f,"%d %d",&N,&M);
for(i=2;i<=N;++i)
{
fscanf(f,"%d",&X);
graf[X].push_back(i);
}
Rank[1]=1,Poz[1]=1,N=0;
DFS(1);
CreateRMQ();
}
void Solve()
{
int X,Y,A,B,Sol;
while(M)
{
--M;
fscanf(f,"%d %d",&X,&Y);
X=Poz[X],Y=Poz[Y];
ss[1]=X,ss[2]=Y;
sort(ss+1,ss+3);
X=ss[1],Y=ss[2];
A=log[Y-X+1];
if(Rank[RMQ[A][X]]<Rank[RMQ[A][Y-(1<<A)+1]])Sol=RMQ[A][X];
else Sol=RMQ[A][Y-(1<<A)+1];
fprintf(g,"%d\n",Sol);
}
}
int main()
{
f=fopen("lca.in","r");g=fopen("lca.out","w");
Read();Solve();
fclose(f);fclose(g);
return 0;
}