#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],pdfs[100010],Poz[100010];
struct AIB
{
int node,r;
};
AIB ARB[2*100010];
int N,M;
vector <int> graf[100010];
int ss[3];
void DFS(int Node)
{
int i,T=graf[Node].size(),vecin;
pdfs[++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);
pdfs[++N]=Node;
}
}
}
int P,XX;
int Update()
{
int i;
for(i=1;i<2*100010;++i)ARB[i].r=oo;
}
void UpdateX(int left,int right,int Node)
{
int middle=(right+left)/2;
if(right==left)
{
ARB[Node].r=Rank[XX];ARB[Node].node=XX;
return;
}
if(P<=middle) UpdateX(left,middle,2*Node);
else UpdateX(middle+1,right,2*Node+1);
ARB[Node].r=Min(ARB[2*Node+1].r,ARB[2*Node].r);
if(ARB[2*Node].r<ARB[2*Node+1].r)ARB[Node].node=ARB[2*Node].node;
else ARB[Node].node=ARB[2*Node+1].node;
}
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);Update();
for(i=1;i<N;++i)
{
P=i,XX=pdfs[i];
UpdateX(1,N-1,1);
}
}
int A,B,Sol;
void Search(int left,int right,int Node)
{
int middle;
if(A<=left&&right<=B)
{
if(Sol>ARB[Node].r)Sol=ARB[Node].r,P=ARB[Node].node;
return;
}
middle=(right+left)/2;
if(A<=middle) Search(left,middle,2*Node);
if(B>middle) Search(middle+1,right,2*Node+1);
}
void Solve()
{
int X,Y;
while(M)
{
--M;
fscanf(f,"%d %d",&X,&Y);
A=Poz[X],B=Poz[Y],Sol=oo;
ss[1]=A,ss[2]=B;
sort(ss+1,ss+3);
A=ss[1],B=ss[2];
Search(1,N,1);
fprintf(g,"%d\n",P);
}
}
int main()
{
f=fopen("lca.in","r");g=fopen("lca.out","w");
Read();Solve();
fclose(f);fclose(g);
return 0;
}