#include <bits/stdc++.h>
using namespace std;
int visited[100005], level[100005], parent[100005], ancestor[20][100005],
    result[100005];
vector<int> graph[100005], root;
map<int, int>* M[100005];
map<int, int>::iterator it;
vector<pair<int, int> > query[100005];
void dfs(int node) {
  int i, temp;
  for (i = 0; i < graph[node].size(); i++) {
    temp = graph[node][i];
    if (visited[temp] == 0) {
      visited[temp] = 1;
      level[temp] = level[node] + 1;
      parent[temp] = node;
      dfs(temp);
    }
  }
}
void dfs2(int node, int parent) {
  int i, temp, maxi = -1, idx = -1;
  for (i = 0; i < graph[node].size(); i++) {
    temp = graph[node][i];
    if (visited[temp] == 0) {
      visited[temp] = 1;
      dfs2(temp, node);
      if ((int)M[temp]->size() > maxi) {
        maxi = (int)M[temp]->size();
        idx = temp;
      }
    }
  }
  if (idx != -1) M[node] = M[idx];
  (*M[node])[level[node]]++;
  for (i = 0; i < graph[node].size(); i++) {
    temp = graph[node][i];
    if (temp != idx && temp != parent) {
      for (it = M[temp]->begin(); it != M[temp]->end(); ++it)
        (*M[node])[it->first] += it->second;
      free(M[temp]);
    }
  }
  for (i = 0; i < query[node].size(); i++) {
    pair<int, int> bar = query[node][i];
    result[bar.second] = (*M[node])[bar.first];
  }
  return;
}
void preCompute(int n) {
  int i, j;
  for (i = 1; i <= n; i++) ancestor[0][i] = parent[i];
  for (i = 1; i < 20; i++)
    for (j = 1; j <= n; j++)
      ancestor[i][j] = ancestor[i - 1][ancestor[i - 1][j]];
  return;
}
int getAncestor(int node, int depth) {
  int i, ret = node;
  if (depth == 0) return ret;
  for (i = 0; i < 20; i++)
    if (((depth >> i) & 1)) ret = ancestor[i][ret];
  return ret;
}
int main() {
  int i, j, t, n, m, k, l, r, temp, mini, maxi, flag, cnt;
  scanf("%d", &n);
  for (i = 1; i <= n; i++) {
    M[i] = new map<int, int>;
    scanf("%d", &k);
    if (k != 0) {
      graph[i].push_back(k);
      graph[k].push_back(i);
    } else
      root.push_back(i);
  }
  for (i = 0; i < root.size(); i++) {
    temp = root[i];
    visited[temp] = 1;
    level[temp] = 0;
    dfs(temp);
  }
  preCompute(n);
  scanf("%d", &m);
  for (i = 1; i <= m; i++) {
    scanf("%d%d", &l, &r);
    int anc = getAncestor(l, r);
    if (anc == 0)
      result[i] = 1;
    else
      query[anc].push_back(make_pair(level[anc] + r, i));
  }
  for (i = 1; i <= n; i++) visited[i] = 0;
  for (i = 0; i < root.size(); i++) {
    temp = root[i];
    visited[temp] = 1;
    dfs2(temp, 0);
  }
  for (i = 1; i <= m; i++) printf("%d ", result[i] - 1);
  printf("\n");
  return 0;
}
