#include <iostream>
#include <fstream>
#include <vector>
#define lim 100001
using namespace std;
ifstream f("lca.in");
ofstream g("lca.out");
int n, m, E[lim<<1], Lev[lim<<1], Lg[lim<<1], First[lim<<1], t = 0, rmq[lim<<1][20];
vector<int> G[lim];
void Dfs(int node, int lev)
{
E[++t] = node;
Lev[t] = lev;
First[node] = t;
for(vector<int> :: iterator it = G[node].begin(); it != G[node].end(); ++it)
{
Dfs(*it, lev+1);
E[++t] = node;
Lev[t] = lev;
}
}
void Rmq()
{
for(int i = 2; i <= t; ++i)
Lg[i] = Lg[i>>1] + 1;
for(int i = 1; i <= t; ++i)
rmq[i][0] = i;
for(int j = 1; (1<<j) < t; ++j)
for(int i = 1; i+(1<<j)-1 <= t; ++i)
if(Lev[rmq[i][j-1]] > Lev[rmq[i+(1<<(j-1))][j-1]])
rmq[i][j] = rmq[i+(1<<(j-1))][j-1];
else
rmq[i][j] = rmq[i][j-1];
}
int main()
{
f >> n >> m;
for(int i = 2; i <= n; ++i)
{
int x;
f >> x;
G[x].push_back(i);
}
Dfs(1, 0);
Rmq();
for(int i = 1; i <= m; ++i)
{
int x, y, sol, f1, f2, md, dif, rq;
f >> x >> y;
f1 = First[x], f2 = First[y];
if(f1 > f2) swap(f1, f2);
md = f2 -f1 +1;
sol = rmq[f1][Lg[md]];
dif = f2 - (f1 + (1<<(Lg[md])) -1);
if(dif)
{
rq = Lg[dif-1] +1;
if(Lev[sol] > Lev[rmq[f2-rq][rq]])
sol = rmq[f2-rq][rq];
}
g << E[sol] << "\n";
}
}