#include <fstream>
#include <vector>
using namespace std;
ifstream fin("lca.in");
ofstream fout("lca.out");
vector <int> v[100001];
int k, h[400001];
int p[400001], rmq[20][400001]; //rmq[i][j] = nodul cu nivelul minim din secventa de lungime 1<<i care porneste din j
int ap[100001];
int log2[400001];
void dfs(int r, int niv)
{
k++;
p[k] = r;
h[k] = niv;
ap[r] = k;
for (int i = 0; i<v[r].size(); i++)
{
dfs(v[r][i], niv+1);
k++;
p[k] = r;
h[k] = niv;
}
}
int main()
{
int n, i, m, x, j, d, y;
fin >> n >> m;
for (i = 2; i<=n; i++)
{
fin >> x;
v[x].push_back(i);
}
dfs(1, 0);
for (i = 1; i<=k; i++)
rmq[0][i] = i;
for (i = 2; i<=k; i++)
log2[i] = 1 + log2[i>>1];
for (i = 1; (1<<i) <= k; i++)
for (j = 1; j<=k-(1<<i)+1; j++)
{
rmq[i][j] = rmq[i-1][j];
if (h[rmq[i-1][j+(1<<(i-1))]] < h[rmq[i][j]])
rmq[i][j] = rmq[i-1][j+(1<<(i-1))];
}
for (i = 1; i<=m; i++)
{
fin >> x >> y;
x = ap[x];
y = ap[y];
if (x > y)
swap(x, y);
d = log2[y-x+1];
if (h[rmq[d][x]] < h[rmq[d][y-(1<<d)+1]])
fout << p[rmq[d][x]] << '\n';
else
fout << p[rmq[d][y-(1<<d)+1]] << '\n';
}
return 0;
}