#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ("lca.in");
ofstream g ("lca.out");
int euler[1000005] , x , n , q , k , niv[1000005] , first[100005] , neul , arb[1000005] , minim , y , nr;
vector <int> v[100005];
void build (int nod , int left , int right)
{
if (left == right)
{
arb[nod] = euler[left];
return;
}
int mij = (left + right) / 2;
build (2 * nod , left , mij);
build (2 * nod + 1 , mij + 1 , right);
if (niv[arb[2 * nod]] < niv[arb[2 * nod + 1]])
arb[nod] = arb[2 * nod];
else
arb[nod] = arb[2 * nod + 1];
}
void querry (int nod , int left , int right , int ql , int qr)
{
if (ql <= left && right <= qr)
{
if (niv[arb[nod]] < minim)
{
minim = niv[arb[nod]];
nr = arb[nod];
}
return;
}
int mij = (left + right) / 2;
if (ql <= mij)
querry (2 * nod , left , mij , ql , qr);
if (qr > mij)
querry (2 * nod + 1 , mij + 1 , right , ql , qr);
}
void dfs (int nod , int nivel)
{
euler[++k] = nod;
niv[nod] = nivel;
first[nod] = k;
for (int i = 0 ; i < v[nod].size () ; i++)
{
int vecin = v[nod][i];
dfs (vecin , nivel + 1);
euler[++k] = nod;
}
}
int main()
{
f >> n >> q;
for (int i = 2 ; i <= n ; i++)
{
f >> x;
v[x].push_back (i);
}
dfs (1 , 0);
neul = k;
build (1 , 1 , neul);
for (int i = 1 ; i <= q ; i++)
{
f >> x >> y;
if (first[x] < first[y])
{
minim = 2e9 , nr = 0;
querry (1 , 1 , neul , first[x] , first[y]);
g << nr << '\n';
}
else
{
minim = 2e9 , nr = 0;
querry (1 , 1 , neul , first[y] , first[x]);
g << nr << '\n';
}
}
return 0;
}