#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 7;
vector<int> g[N];
int cnt = 0, tin[N], tout[N], flor[N];
vector<int> flatin[N];
vector<int> flatout[N];
int up[N][25];
int len;
void dfs(int v, int p) {
  up[v][0] = p;
  tin[v] = ++cnt;
  flor[v] = flor[p] + 1;
  flatin[flor[v]].push_back(tin[v]);
  for (int i = 1; i <= len; i++) up[v][i] = up[up[v][i - 1]][i - 1];
  for (int i = 0; i < g[v].size(); i++) {
    int to = g[v][i];
    if (to == p) continue;
    dfs(to, v);
  }
  tout[v] = ++cnt;
  flatout[flor[v]].push_back(tout[v]);
}
int bin_jump(int v, int p) {
  if (p == 1 || p == 0) {
    if (p == 1) {
      return up[v][0];
    } else {
      return v;
    }
  }
  int tw;
  tw = log2(p);
  return bin_jump(up[v][tw], p - (1 << tw));
}
int main() {
  int n;
  cin >> n;
  len = ceil(log2(n));
  for (int i = 1; i <= n; i++) {
    int a;
    scanf("%d", &a);
    if (!a) continue;
    g[a].push_back(i);
    g[i].push_back(a);
  }
  for (int i = 1; i <= n; i++) {
    if (!tin[i]) {
      dfs(i, 0);
    }
  }
  int m;
  cin >> m;
  while (m--) {
    int v, p;
    scanf("%d%d", &v, &p);
    int ppr = bin_jump(v, p);
    int flr;
    flr = flor[ppr] + p;
    if (!ppr) {
      cout << 0 << endl;
      continue;
    }
    int l, r;
    l = upper_bound(flatin[flr].begin(), flatin[flr].end(), tin[ppr]) -
        flatin[flr].begin();
    l++;
    r = lower_bound(flatout[flr].begin(), flatout[flr].end(), tout[ppr]) -
        flatout[flr].begin();
    int ans;
    ans = r - l;
    printf("%d\n", ans);
  }
}
