#include <iostream>
#include <fstream>
#include <vector>
#define maxi 100005
#define INF 0x3f3f3f3f
using namespace std;
ifstream f("lca.in",ios::in);
ofstream g("lca.out",ios::out);
vector<int> V[maxi];
int n,m,euler[maxi<<1],l[maxi<<1],v[maxi<<4],x,k,first[maxi];
bool viz[maxi];
void DFS(int x,int lvl)
{
viz[x]=true;
euler[++k]=x;
l[k]=lvl;
first[x]=k;
for(auto a:V[x])
{
if(!viz[a])
{
DFS(a,lvl+1);
euler[++k]=x;
l[k]=lvl;
}
}
}
void BUILD(int nod,int st,int dr)
{
if(st>dr)
return;
if(st==dr)
{
v[nod]=st;
return;
}
int mid=(st+dr)>>1;
BUILD(2*nod,st,mid);
BUILD(2*nod+1,mid+1,dr);
if(l[v[2*nod]]<=l[v[2*nod+1]])
v[nod]=v[2*nod];
else v[nod]=v[2*nod+1];
}
void QUERY(int nod,int st,int dr,int a,int b,int&sol,int&hsol)
{
if(st>dr)
return;
if(st>=a&&dr<=b)
{
if(l[v[nod]]<hsol)
{
hsol=l[v[nod]];
sol=euler[v[nod]];
}
return;
}
int mid=(st+dr)>>1;
if(a<=mid)
QUERY(2*nod,st,mid,a,b,sol,hsol);
if(b>mid)
QUERY(2*nod+1,mid+1,dr,a,b,sol,hsol);
}
int LCA(int x,int y)
{
int s=first[x];
int d=first[y];
if(s>d)
swap(s,d);
int soll=INF;
int hsoll=INF;
QUERY(1,1,k,s,d,soll,hsoll);
return soll;
}
void SOLVE()
{
int p,t;
f>>n>>m;
for(int i=2;i<=n;i++)
{
f>>x;
V[x].push_back(i);
}
DFS(1,0);
BUILD(1,1,k);
for(int i=1;i<=m;i++)
{
f>>p>>t;
g<<LCA(p,t)<<'\n';
}
f.close();
g.close();
return;
}
int main()
{
SOLVE();
return 0;
}