/**
 * 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;
}