#include <bits/stdc++.h>
using namespace std;
int rmq[22][400005];
int E[400005],k;
int niv[400005],poz[100003];
int a[100003],n;
int P[100003];
vector<int>L[100003];
void Euler(int nod,int nivel)
{
E[++k]=nod;
niv[k]=nivel;
poz[nod]=k;
for(auto i:L[nod])
{
Euler(i,nivel+1);
E[++k]=nod;
niv[k]=nivel;
}
}
int main()
{
int i,j,x,y,N,Q;
ifstream fin("lca.in");
ofstream fout("lca.out");
fin>>n>>Q;
for(i=2; i<=n; i++)
{
fin>>x;
L[x].push_back(i);
}
Euler(1,1);
///P
P[1]=0;
for(i=2; i<=k; i++)
P[i]=1+P[i/2];
///rmq
for(i=1; i<=k; i++)
rmq[0][i]=i;
N=P[k];
for(i=1; i<=N; i++)
for(j=1; j<=k+1-(1<<i); j++)
{
x=niv[rmq[i-1][j]];
y=niv[rmq[i-1][j+(1<<(i-1))]];
if(x<y)rmq[i][j]=rmq[i-1][j];
else rmq[i][j]=rmq[i-1][j+(1<<(i-1))];
}
///Q
while(Q--)
{
fin>>x>>y;
x=poz[x];
y=poz[y];
if(x>y)swap(x,y);
N=P[y-x+1];
i=rmq[N][x];
j=rmq[N][y-(1<<N)+1];
if(niv[i]<niv[j])fout<<E[i]<<"\n";
else fout<<E[j]<<"\n";
}
fout.close();
return 0;
}