#include <bits/stdc++.h>
using namespace std;
vector<int> by[100005];
int n, m;
unsigned int st[100005];
char ss[25];
map<pair<int, int>, int> Map;
int F[100005][20], root = 0;
int Ls[100005], Rs[100005];
vector<int> LevL[100005];
vector<int> LevR[100005];
int ans[100005];
vector<int> lev[100005];
int id[100005];
int dp[100005];
const int Maxint = 0x7fffffff;
unsigned int BKDRHash(char str[]) {
  unsigned int seed = 131;
  unsigned int has = 0;
  for (int i = 0; str[i] != '\0'; i++) has = has * seed + (str[i]);
  return (has & Maxint);
}
void input() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%s%d", ss, &F[i][0]);
    st[i] = BKDRHash(ss);
    by[F[i][0]].push_back(i);
  }
}
void dfs(int rt, int dep, int &step) {
  lev[dep].push_back(rt);
  dp[rt] = dep;
  Ls[rt] = ++step;
  for (int i = 0; i < (int)by[rt].size(); i++) dfs(by[rt][i], dep + 1, step);
  Rs[rt] = ++step;
}
int cmp(int x, int y) { return Ls[x] < y; }
int lowbond(int level, int y) {
  return lower_bound(lev[level].begin(), lev[level].end(), y, cmp) -
         lev[level].begin();
}
void solve() {
  int v, k, l, r;
  scanf("%d", &m);
  memset(ans, 0, sizeof(ans));
  Map.clear();
  int de;
  for (int i = 0; i < m; i++) {
    scanf("%d%d", &v, &k);
    de = dp[v] + k;
    l = lowbond(de, Ls[v]);
    r = lowbond(de, Rs[v]) - 1;
    if (r < l) continue;
    int &t = Map[pair<int, int>(v, k)];
    if (ans[i] = t) continue;
    set<unsigned int> mp;
    for (int j = r; j >= l; j--) {
      int di = lev[de][j];
      mp.insert(st[di]);
    }
    ans[i] = t = mp.size();
  }
  for (int i = 0; i < m; i++) printf("%d\n", ans[i]);
}
int main() {
  input();
  root = 0;
  int step = 0;
  dfs(root, 0, step);
  solve();
  return 0;
}
