#include <bits/stdc++.h>   using namespace std;   inline void read(int &x) {     x = 0;     int f = 1;     char c = getchar();     while (c >  9  || c <  0 ) {       if (c ==  - ) f = -1;       c = getchar();     }     while (c >=  0  && c <=  9 )       x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();     x *= f;   }   const int maxn = 100100;   struct node {     int v, nxt;   } e[maxn];   int head[maxn], tot;   inline void add(int x, int y) {     tot++;     e[tot].v = y;     e[tot].nxt = head[x];     head[x] = tot;   }   struct AA {     int s, num;   };   map<string, int> h;   vector<AA> ask[maxn];   set<int> hip[maxn];   int n, q, s, t, cnt, name[maxn], dep[maxn], son[maxn], size[maxn], ans[maxn];   bool vis[maxn];   char ch[30];   inline void dfs1(int x, int fa) {     size[x] = 1;     dep[x] = dep[fa] + 1;     for (int i = head[x]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == fa) continue;       dfs1(v, x);       size[x] += size[v];       if (son[x] == 0 || size[v] > size[son[x]]) son[x] = v;     }   }   inline void calc(int x, int fa) {     hip[dep[x]].insert(name[x]);     for (int i = head[x]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == fa || vis[v]) continue;       calc(v, x);     }   }   inline void dfs2(int x, int fa, int keep) {     for (int i = head[x]; i; i = e[i].nxt) {       int v = e[i].v;       if (v == fa || v == son[x]) continue;       dfs2(v, x, 0);     }     if (son[x]) dfs2(son[x], x, 1), vis[son[x]] = true;     calc(x, fa);     vis[son[x]] = false;     for (int i = 0; i < ask[x].size(); i++) {       if (dep[x] + ask[x][i].s <= n)         ans[ask[x][i].num] = hip[dep[x] + ask[x][i].s].size();     }     if (!keep) {       for (int i = dep[x]; !hip[i].empty(); i++) {         hip[i].clear();       }     }   }   int main() {     read(n);     for (int i = 1; i <= n; i++) {       scanf( %s , ch);       if (h.find(ch) == h.end()) h[ch] = ++cnt;       name[i] = h[ch];       read(s), add(s, i);     }     read(q);     AA tmp;     for (int i = 1; i <= q; i++) {       read(s), read(t);       tmp.s = t;       tmp.num = i;       ask[s].push_back(tmp);     }     dep[0] = -1;     dfs1(0, 0);     dfs2(0, 0, 1);     for (int i = 1; i <= q; i++) printf( %d n , ans[i]);     return 0;   }   