/**
* Author: Sergey Kopeliovich (Burunduk30@gmail.com)
* Date: 2015.02.16
*/
#include <bits/stdc++.h>
using namespace std;
#define forn(i, n) for (int i = 0; i < (int)(n); i++)
const int N = 1e5;
const int K = 17; // ceil(log_2(N+1))
typedef pair <int, int> pii;
vector<int> c[N]; // graph
vector<pii> et;
pii p[2 * N][K];
int bn[2 * N];
int pos[N]; // позиция в Эйлеровом обходе
// 1 -> 2, 3
// (0,1) (1,2) (0,1) (1,3) (0,1)
void dfs( int v, int d = 0 ) {
pos[v] = et.size();
et.push_back(pii(d, v));
for (int x : c[v]) {
dfs(x, d + 1);
et.push_back(pii(d, v));
}
}
void init() {
int L = et.size();
// bn[0] = bn[1] = 0
for (int i = 2; i <= L; i++)
bn[i] = 1 + bn[i / 2]; // 2^bn[i] <= i
for (int i = 0; i < L; i++)
p[i][0] = et[i]; // (depth[v], v)
for (int k = 1; k < K; k++)
for (int i = 0; i <= L - (1 << k); i++)
p[i][k] = min(p[i][k-1], p[i + (1 << (k-1))][k-1]);
}
int lca( int a, int b ) {
// min на отрезке [ pos[a], pos[b] ]
a = pos[a], b = pos[b];
if (a > b) swap(a, b);
int k = bn[b - a + 1];
return min(p[a][k], p[b - (1 << k) + 1][k]).second;
}
int main() {
int n;
cin >> n;
for (int i = 1; i < n; i++) {
int v;
cin >> v, v--;
c[v].push_back(i);
}
dfs(0); // euler tour
init(); // sparse table
int a, b, k;
cin >> k;
while (k--) {
cin >> a >> b;
cout << lca(a - 1, b - 1) + 1 << endl;
}
return 0;
}