#include <bits/stdc++.h>
long long q_pow(long long x, long long n, long long mod) {
  long long ret = 1;
  while (n) {
    if (n & 1) ret = x * ret % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return ret;
}
long long __gcd(long long x, long long y) {
  if (!y) return x;
  return __gcd(y, x % y);
}
long long getbit(long long now) {
  int cnt = 0;
  while (now) {
    cnt++;
    now -= (now) & (-now);
  }
  return cnt;
}
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
using namespace std;
const long long maxn = 1e6 + 10;
const long long INF = 0x3f3f3f3f;
const long long IINF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-9;
int mod = 998244353;
vector<pair<int, int> > qry[maxn];
int ans[maxn];
vector<int> edge[maxn];
int dep[maxn], dp[maxn][21];
int son[maxn], sz[maxn];
int n;
int cnt[maxn];
void calc(int pos, int fa, int val) {
  cnt[dep[pos]] += val;
  for (auto to : edge[pos]) {
    if (to == fa) continue;
    calc(to, pos, val);
  }
}
void dfs1(int pos, int fa) {
  sz[pos] = 1;
  dp[pos][0] = fa;
  for (int i = 1; i <= 20; i++) dp[pos][i] = dp[dp[pos][i - 1]][i - 1];
  for (auto to : edge[pos]) {
    if (to == fa) continue;
    dep[to] = dep[pos] + 1;
    dfs1(to, pos);
    sz[pos] += sz[to];
    if (sz[to] > sz[son[pos]]) son[pos] = to;
  }
}
int find_k(int pos, int kth) {
  int delta = dep[pos] - kth;
  for (int i = 20; i >= 0; i--) {
    if (dep[dp[pos][i]] > delta) {
      pos = dp[pos][i];
    }
  }
  return dp[pos][0];
}
void dfs2(int pos, int fa, int flag) {
  for (auto to : edge[pos]) {
    if (to == son[pos]) continue;
    if (to == fa) continue;
    dfs2(to, pos, 0);
  }
  if (son[pos]) dfs2(son[pos], pos, 1);
  for (auto to : edge[pos]) {
    if (to == son[pos] or to == fa) continue;
    calc(to, pos, 1);
  }
  cnt[dep[pos]]++;
  for (auto to : qry[pos]) {
    ans[to.second] = cnt[dep[pos] + to.first];
  }
  if (!flag) calc(pos, fa, -1);
}
void solve() {
  cin >> n;
  int u;
  for (int i = 1; i <= n; i++) {
    cin >> u;
    edge[u].emplace_back(i);
  }
  dfs1(0, 0);
  int m;
  cin >> m;
  for (int i = 1; i <= m; i++) {
    int u, v;
    cin >> u >> v;
    int fa = find_k(u, v);
    if (fa != 0) qry[fa].emplace_back(make_pair(v, i));
  }
  dfs2(0, 0, 1);
  for (int i = 1; i <= m; i++) {
    cout << max(ans[i] - 1, 0) << " ";
  }
  cout << "\n";
}
signed main(int argc, char *argv[]) {
  if (argc == 2 && strcmp("-debug", argv[1]) == 0) {
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
  }
  cout << fixed << setprecision(20);
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
