#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream cin ("lca.in");
ofstream cout ("lca.out");
const int MAXN = 1e5+5;
int n, m, N;
vector<int> adj[MAXN];
int lev[MAXN];
int E[2 * MAXN]; // turul Euler
int pos[MAXN];
int lg2[2 * MAXN]; // partea intreaga a log2
int rmq[18][2 * MAXN]; // rmq[i][j] = poz
void Dfs(int x, int lv)
{
lev[x] = lv;
E[++N] = x;
pos[x] = N; // prima aparitie a lui x in turul Euler
for (int y : adj[x])
{
Dfs(y, lv + 1);
E[++N] = x;
}
}
int get_min(int x, int y)
{
if (lev[x] < lev[y]) return x;
return y;
}
void Rmq()
{
for (int i = 2; i <= N; ++i)
lg2[i] = lg2[i / 2] + 1;
for (int i = 1; i <= N; ++i)
rmq[0][i] = E[i];
for (int i = 1; (1 << i) <= N; ++i)
for (int j = 1; j + (1 << i) - 1 <= N; ++j)
rmq[i][j] = get_min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1))]);
}
int LCA(int x, int y)
{
int px = pos[x];
int py = pos[y];
if (px > py) swap(px, py);
int k = lg2[py - px + 1];
return get_min(rmq[k][px], rmq[k][py - (1 << k) + 1]);
}
int main()
{
cin >> n >> m;
for (int i = 2; i <= n; ++i)
{
int fa;
cin >> fa;
adj[fa].push_back(i);
}
Dfs(1, 1);
Rmq();
for (int i = 1, x, y; i <= m; ++i)
{
cin >> x >> y;
cout << LCA(x, y) << '\n';
}
}