#include <bits/stdc++.h>
#define mp make_pair
#define Minim(i,j) l[i]<l[j] ? i : j
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n,m,k;
int poz[1<<17],e[1<<18],l[1<<18],ai[1<<20];
vector <int> v[1<<17];
void Euler(int nod,int niv)
{ e[++k]=nod;
l[k]=niv;
poz[nod]=k;
for(int i=0; i<v[nod].size(); i++)
{ Euler(v[nod][i],niv+1);
e[++k]=nod;
l[k]=niv;
}
}
void Build(int nod,int st,int dr)
{ if(st==dr)
{ ai[nod]=st;
return;
}
int mij=(st+dr)/2;
Build(2*nod,st,mij);
Build(2*nod+1,mij+1,dr);
ai[nod]=Minim(ai[2*nod],ai[2*nod+1]);
}
int Query(int nod,int st,int dr,int x,int y)
{ if(st>=x && dr<=y)
return ai[nod];
int mij=(st+dr)/2;
int i=k+1,j=k+1;
if(x<=mij)
i=Query(2*nod,st,mij,x,y);
if(mij<y)
j=Query(2*nod+1,mij+1,dr,x,y);
return Minim(i,j);
}
int main()
{ f>>n>>m;
for(int x,i=2; i<=n; i++)
{ f>>x;
v[x].push_back(i);
}
Euler(1,1);
Build(1,1,k);
l[k+1]=1<<30;
for(int x,y; f>>x>>y;)
{ x=poz[x];
y=poz[y];
if(x>y)
swap(x,y);
g<<e[Query(1,1,k,x,y)]<<'\n';
}
f.close(); g.close(); return 0;
}