#include <iostream>
#include <vector>
#include <map>
#include <set>
using namespace std;
const int N = 1e5 + 5;
struct NODE {
int id, a;
};
int n, siz[N], dep[N], son[N], heavy, m, ans[N];
string s[N];
vector<int> nbr[N];
vector<NODE> q[N];
set<string> qs;
map<string, int> cnt[N];
inline void dfs(int x, int fa) {
if (x != 0) {
siz[x] = 1;
}
dep[x] = dep[fa] + 1;
for (int i = 0; i < nbr[x].size(); ++i) {
int to = nbr[x][i];
if (to == fa) {
continue;
}
dfs(to, x);
siz[x] += siz[to];
if (son[x] == 0 || siz[son[x]] < siz[to]) {
son[x] = to;
}
}
}
inline void update(int x, int fa, int val) {
cnt[dep[x]][s[x]] += val;
for (int i = 0; i < nbr[x].size(); ++i) {
int to = nbr[x][i];
if (to == fa || to == heavy) {
continue;
}
update(to, x, val);
}
}
inline int check(int x) {
int sum = 0;
for (auto it : qs) {
sum += (cnt[x][it] > 0);
}
return sum;
}
inline void get_anser(int x) {
for (int i = 0; i < q[x].size(); ++i) {
int id = q[x][i].id, d = q[x][i].a;
ans[id] = check(d);
}
}
inline void dfs2(int x, int fa, int big) {
for (int i = 0; i < nbr[x].size(); ++i) {
int to = nbr[x][i];
if (to == son[x] || to == fa) {
continue;
}
dfs2(to, x, 0);
}
if (son[x]) {
dfs2(son[x], x, 1);
heavy = son[x];
}
update(x, fa, 1);
heavy = 0;
get_anser(x);
if (big == 0) {
update(x, fa, -1);
}
}
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
int f;
cin >> s[i] >> f;
qs.insert(s[i]);
nbr[f].push_back(i);
}
cin >> m;
for (int i = 1; i <= m; ++i) {
int a, b;
cin >> a >> b;
q[a].push_back((NODE){i, b});
}
dep[0] = 0;
for (int i = 1; i <= n; ++i) {
for (auto it : qs) {
cout << it << cnt[i][it] << ' ';
}
cout << '\n';
}
dfs(0, 0);
dfs2(0, 0, 0);
for (int i = 1; i <= m; ++i) {
cout << ans[i] << '\n';
}
}