/// Author : Nguyễn Thái Sơn - K18 - KHMT - UIT
/// Training ICPC 2024
#include<bits/stdc++.h>
/// #pragma GCC optimize("O3,unroll-loops")
/// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#define fi first
#define se second
#define TASK "test"
#define pb push_back
#define EL cout << endl
#define Ti20_ntson int main()
#define in(x) cout << x << endl
#define all(x) (x).begin(),(x).end()
#define getbit(x, i) (((x) >> (i)) & 1)
#define cntbit(x) __builtin_popcount(x)
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FORD(i,l,r) for (int i = l; i >= r; i--)
#define Debug(a,n) for (int i = 1; i <= n; i++) cout << a[i] << " "; cout << endl
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> vii;
typedef unsigned long long ull;
typedef vector<vector<int>> vvi;
int fastMax(int x, int y) { return (((y-x)>>(32-1))&(x^y))^y; }
const int N = 1e5 + 5;
const int oo = INT_MAX;
const int mod = 1e9 + 7;
const int d4x[4] = {-1, 0, 1, 0} , d4y[4] = {0, 1, 0, -1};
const int d8x[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, d8y[8] = {0, 1, 1, 1, 0, -1, -1, -1};
int val[N], Q, n;
vector<int> dsk[N];
map<string, int> mp;
int cnt;
vector<pair<int, int>> Queries[N];
set<int> S[N];
inline void Read_Input() {
cin >> n;
FOR(i, 1, n) {
string s;
int p;
cin >> s >> p;
dsk[p].push_back(i);
if (mp.find(s) == mp.end()) {
++cnt;
mp[s] = cnt;
val[i] = cnt;
}
else {
val[i] = mp[s];
}
}
cin >> Q;
FOR(i, 1, Q) {
int v, k;
cin >> v >> k;
Queries[v].push_back({k, i});
}
cnt = 0;
}
int sz[N], h[N], ver[N], tin[N], tout[N], ans[N];
inline void DFS(int u, int val) {
sz[u] = 1;
tin[u] = ++cnt;
ver[cnt] = u;
for (int v : dsk[u]) {
h[v] = h[u] + 1;
DFS(v, val),
sz[u] += sz[v];
}
tout[u] = cnt;
}
inline void dfs(int u, bool keep) {
/// u = 0
/// no queries here
int Heavy = -1;
for (int v : dsk[u])
if (Heavy == - 1 || sz[v] > sz[Heavy]) Heavy = v;
for (int v : dsk[u])
if (v != Heavy) {
dfs(v, false);
}
if (Heavy != -1) {
dfs(Heavy, true);
}
int Best = 0;
for (int v : dsk[u])
if (v != Heavy) {
FOR(i, tin[v], tout[v]) {
int cc = ver[i];
/// dinh cc
int hi = h[cc];
/// dinh cc
/// do cao h[cc]
/// ten = val[cc]
S[hi].insert(val[cc]);
}
}
S[h[u]].insert(val[u]);
/// u = 3
for (auto[k, i] : Queries[u]) {
/// có bao nhiêu đỉnh khác nhau ở độ cao cách u = k
/// dộ cao h[] = h[u] + k
if (h[u] + k > n) ans[i] = 0;
else
ans[i] = S[h[u] + k].size();
}
if (keep == false) {
FOR(i, tin[u], tout[u]) {
int cc = ver[i];
S[h[cc]].erase(val[cc]);
}
}
}
inline void Solve() {
DFS(0, 0);
dfs(0, 1);
FOR(i, 1, Q)
cout << ans[i] << endl;
}
Ti20_ntson {
// freopen(TASK".INP","r",stdin);
// freopen(TASK".OUT","w",stdout);
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int T = 1;
// cin >> T;
while (T -- ) {
Read_Input();
Solve();
}
}
Ly8vIEF1dGhvciA6IE5ndXnhu4VuIFRow6FpIFPGoW4gLSBLMTggLSBLSE1UIC0gVUlUCi8vLyBUcmFpbmluZyBJQ1BDIDIwMjQKCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CgovLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zLHVucm9sbC1sb29wcyIpCi8vLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIsbHpjbnQscG9wY250IikKCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBUQVNLICJ0ZXN0IgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIEVMIGNvdXQgPDwgZW5kbAojZGVmaW5lIFRpMjBfbnRzb24gaW50IG1haW4oKQojZGVmaW5lIGluKHgpIGNvdXQgPDwgeCA8PCBlbmRsCiNkZWZpbmUgYWxsKHgpICh4KS5iZWdpbigpLCh4KS5lbmQoKQojZGVmaW5lIGdldGJpdCh4LCBpKSAoKCh4KSA+PiAoaSkpICYgMSkKI2RlZmluZSBjbnRiaXQoeCkgX19idWlsdGluX3BvcGNvdW50KHgpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IgKGludCBpID0gbDsgaSA8PSByOyBpKyspCiNkZWZpbmUgRk9SRChpLGwscikgZm9yIChpbnQgaSA9IGw7IGkgPj0gcjsgaS0tKQojZGVmaW5lIERlYnVnKGEsbikgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBjb3V0IDw8IGFbaV0gPDwgIiAiOyBjb3V0IDw8IGVuZGwKCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKdHlwZWRlZiBwYWlyPGludCxpbnQ+IHZpaTsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gdnZpOwppbnQgZmFzdE1heChpbnQgeCwgaW50IHkpIHsgcmV0dXJuICgoKHkteCk+PigzMi0xKSkmKHheeSkpXnk7IH0KCmNvbnN0IGludCBOID0gMWU1ICsgNTsKY29uc3QgaW50IG9vID0gSU5UX01BWDsKY29uc3QgaW50IG1vZCA9IDFlOSArIDc7CmNvbnN0IGludCBkNHhbNF0gPSB7LTEsIDAsIDEsIDB9ICwgZDR5WzRdID0gezAsIDEsIDAsIC0xfTsKY29uc3QgaW50IGQ4eFs4XSA9IHstMSwgLTEsIDAsIDEsIDEsIDEsIDAsIC0xfSwgZDh5WzhdID0gezAsIDEsIDEsIDEsIDAsIC0xLCAtMSwgLTF9OwoKaW50IHZhbFtOXSwgUSwgbjsKdmVjdG9yPGludD4gZHNrW05dOwptYXA8c3RyaW5nLCBpbnQ+IG1wOwppbnQgY250Owp2ZWN0b3I8cGFpcjxpbnQsIGludD4+IFF1ZXJpZXNbTl07CnNldDxpbnQ+IFNbTl07CgppbmxpbmUgdm9pZCBSZWFkX0lucHV0KCkgewogICAgY2luID4+IG47CiAgICBGT1IoaSwgMSwgbikgewogICAgICAgIHN0cmluZyBzOwogICAgICAgIGludCBwOwogICAgICAgIGNpbiA+PiBzID4+IHA7CgogICAgICAgIGRza1twXS5wdXNoX2JhY2soaSk7CgogICAgICAgIGlmIChtcC5maW5kKHMpID09IG1wLmVuZCgpKSB7CiAgICAgICAgICAgICsrY250OwogICAgICAgICAgICBtcFtzXSA9IGNudDsKICAgICAgICAgICAgdmFsW2ldID0gY250OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFsW2ldID0gbXBbc107CiAgICAgICAgfQogICAgfQogICAgY2luID4+IFE7CiAgICBGT1IoaSwgMSwgUSkgewogICAgICAgIGludCB2LCBrOwogICAgICAgIGNpbiA+PiB2ID4+IGs7CiAgICAgICAgUXVlcmllc1t2XS5wdXNoX2JhY2soe2ssIGl9KTsKICAgIH0KICAgIGNudCA9IDA7Cn0KCmludCBzeltOXSwgaFtOXSwgdmVyW05dLCB0aW5bTl0sIHRvdXRbTl0sIGFuc1tOXTsKCmlubGluZSB2b2lkIERGUyhpbnQgdSwgaW50IHZhbCkgewogICAgc3pbdV0gPSAxOwogICAgdGluW3VdID0gKytjbnQ7CiAgICB2ZXJbY250XSA9IHU7CiAgICBmb3IgKGludCB2IDogZHNrW3VdKSB7CiAgICAgICAgaFt2XSA9IGhbdV0gKyAxOwogICAgICAgIERGUyh2LCB2YWwpLAogICAgICAgIHN6W3VdICs9IHN6W3ZdOwogICAgfQogICAgdG91dFt1XSA9IGNudDsKfQoKCmlubGluZSB2b2lkIGRmcyhpbnQgdSwgYm9vbCBrZWVwKSB7CiAgICAvLy8gdSA9IDAKICAgIC8vLyBubyBxdWVyaWVzIGhlcmUgCiAgICAKICAgIGludCBIZWF2eSA9IC0xOwogICAgZm9yIChpbnQgdiA6IGRza1t1XSkKICAgICAgICBpZiAoSGVhdnkgPT0gLSAxIHx8IHN6W3ZdID4gc3pbSGVhdnldKSBIZWF2eSA9IHY7CiAgICBmb3IgKGludCB2IDogZHNrW3VdKQogICAgICAgIGlmICh2ICE9IEhlYXZ5KSB7CiAgICAgICAgICAgIGRmcyh2LCBmYWxzZSk7CiAgICAgICAgfQoKICAgIGlmIChIZWF2eSAhPSAtMSkgewogICAgICAgIGRmcyhIZWF2eSwgdHJ1ZSk7CiAgICB9CgogICAgaW50IEJlc3QgPSAwOwogICAgZm9yIChpbnQgdiA6IGRza1t1XSkKICAgICAgICBpZiAodiAhPSBIZWF2eSkgewogICAgICAgICAgICBGT1IoaSwgdGluW3ZdLCB0b3V0W3ZdKSB7CiAgICAgICAgICAgICAgICBpbnQgY2MgPSB2ZXJbaV07CiAgICAgICAgICAgICAgICAvLy8gZGluaCBjYwogICAgICAgICAgICAgICAgaW50IGhpID0gaFtjY107CgogICAgICAgICAgICAgICAgLy8vIGRpbmggY2MKICAgICAgICAgICAgICAgIC8vLyBkbyBjYW8gaFtjY10KICAgICAgICAgICAgICAgIC8vLyB0ZW4gPSB2YWxbY2NdCgogICAgICAgICAgICAgICAgU1toaV0uaW5zZXJ0KHZhbFtjY10pOwoKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIFNbaFt1XV0uaW5zZXJ0KHZhbFt1XSk7CiAgICAvLy8gdSA9IDMKCiAgICBmb3IgKGF1dG9baywgaV0gOiBRdWVyaWVzW3VdKSB7CiAgICAgICAgLy8vIGPDsyBiYW8gbmhpw6p1IMSR4buJbmgga2jDoWMgbmhhdSDhu58gxJHhu5kgY2FvIGPDoWNoIHUgPSBrCgogICAgICAgIC8vLyBk4buZIGNhbyBoW10gPSAgaFt1XSArIGsKICAgICAgICBpZiAoaFt1XSArIGsgPiBuKSBhbnNbaV0gPSAwOwogICAgICAgIGVsc2UKICAgICAgICBhbnNbaV0gPSBTW2hbdV0gKyBrXS5zaXplKCk7CgogICAgfQoKICAgIGlmIChrZWVwID09IGZhbHNlKSB7CiAgICAgICAgRk9SKGksIHRpblt1XSwgdG91dFt1XSkgewogICAgICAgICAgICBpbnQgY2MgPSB2ZXJbaV07CiAgICAgICAgICAgIFNbaFtjY11dLmVyYXNlKHZhbFtjY10pOwogICAgICAgIH0KICAgIH0KfQoKaW5saW5lIHZvaWQgU29sdmUoKSB7CiAgICBERlMoMCwgMCk7CiAgICBkZnMoMCwgMSk7CiAgICBGT1IoaSwgMSwgUSkKICAgICAgICBjb3V0IDw8IGFuc1tpXSA8PCBlbmRsOwp9CgpUaTIwX250c29uIHsKLy8gICAgZnJlb3BlbihUQVNLIi5JTlAiLCJyIixzdGRpbik7Ci8vICAgIGZyZW9wZW4oVEFTSyIuT1VUIiwidyIsc3Rkb3V0KTsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGludCBUID0gMTsKLy8gICAgY2luID4+IFQ7CiAgICB3aGlsZSAoVCAtLSApIHsKICAgICAgICBSZWFkX0lucHV0KCk7CiAgICAgICAgU29sdmUoKTsKICAgIH0KfQoKCg==