#include <bits/stdc++.h>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
struct nl
{
int nod,lvl;
}dp[20][200005];
int n,m,lg[200005],poz[100005];
vector<int> g[100005];
int cnt;
void dfs(int nod,int lvl)
{
dp[0][++cnt]={nod,lvl};
poz[nod]=cnt;
for(auto i:g[nod])
{
dfs(i,lvl+1);
dp[0][++cnt]={nod,lvl};
}
}
int main()
{
fin>>n>>m;
for(int i=2; i<=n; i++)
{
int x;
fin>>x;
g[x].push_back(i);
}
dfs(1,0);
for(int i=2; i<=cnt; i++)
lg[i]=lg[i/2]+1;
for(int p=1; p<=lg[cnt]; p++)
{
for(int i=1; i<=cnt-(1<<p)+1; i++)
{
if(dp[p-1][i].lvl>=dp[p-1][i+(1<<(p-1))].lvl)
dp[p][i]=dp[p-1][i+(1<<(p-1))];
else
dp[p][i]=dp[p-1][i];
}
}
int x,y,st,dr;
while(m--)
{
fin>>x>>y;
st=poz[x];
dr=poz[y];
if(st>dr)
swap(st,dr);
int dif=lg[dr-st+1];
if(dp[dif][st].lvl<dp[dif][dr-(1<<dif)+1].lvl)
fout<<dp[dif][st].nod<<'\n';
else
fout<<dp[dif][dr-(1<<dif)+1].nod<<'\n';
}
return 0;
}