应输出 0 实际输出 5
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 10;
struct node {
int v, nxt;
} e[MAXN];
int head[MAXN], tot;
inline
void add(int u, int v) {
e[++tot] = { v, head[u] }, head[u] = tot;
}
int dep[MAXN], size[MAXN], son[MAXN];
void init(int u, int f) {
size[u] = 1, dep[u] = dep[f] + 1;
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
init(v, u), size[u] += size[v];
if (size[son[u]] < size[v]) son[u] = v;
}
}
vector<pair<int, int>> q[MAXN];
string s[MAXN];
map<string, int> cnt[MAXN];
int ans[MAXN];
void calc(int u, int p) {
cnt[dep[u]][s[u]]++;
for (int i = head[u]; i; i = e[i].nxt) if (e[i].v != p) calc(e[i].v, p);
}
void clear(int u) {
cnt[dep[u]][s[u]]--;
if (!cnt[dep[u]][s[u]]) cnt[dep[u]].erase(s[u]);
for (int i = head[u]; i; i = e[i].nxt) clear(e[i].v);
}
void solve(int u) {
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
if (v == son[u]) continue;
solve(v), clear(v);
}
if (son[u]) solve(son[u]); calc(u, son[u]);
for (auto x : q[u]) ans[x.second] = cnt[x.first].size();
}
int n, m;
int main() {
scanf("%d", &n);
for (int i = 1, u; i <= n; i++) cin >> s[i] >> u, u && (add(u, i), 1);
for (int i = 1; i <= n; i++) if (!dep[i]) init(i, 0);
scanf("%d", &m);
for (int i = 1, u, k; i <= m; i++) scanf("%d%d", &u, &k), q[u].push_back({ dep[u] + k, i });
for (int i = 1; i <= n; i++) if (dep[i] == 1) solve(i), clear(i);
for (int i = 1; i <= m; i++) printf("%d\n", ans[i]);
}