#include<bits/stdc++.h>
using namespace std;
int n,m,st;
int fa[500001],x[100001];
int col[500009],ans[500009];
int bj[500009],cnt[500009];
int wson[500009],siz[500009],dep[500009];
string s[100001];
vector<int> e[500009];
vector< pair <int,int> > g[500009];
map<string,int> fl[100001];
void dfs(int u,int f){
siz[u]=1;
dep[u]=dep[f]+1;
for(int i=0;i<e[u].size();++i){
int v=e[u][i];
if(v==f) continue;
dfs(v,u);
siz[u]+=siz[v];
if(siz[wson[u]]<siz[v]) wson[u]=v;
}
}
void solve(int u,int f,int k){
fl[dep[u]][s[u]]+=k;
if(fl[dep[u]][s[u]]==1 && k==1) cnt[dep[u]]++;
if(fl[dep[u]][s[u]]==0 && k==-1) cnt[dep[u]]--;
for(int i=0;i<e[u].size();++i){
int v=e[u][i];
if(v!=f && !bj[v])
solve(v,u,k);
}
}
void dsu(int u,int f,int k){
for(int i=0;i<e[u].size();++i){
int v=e[u][i];
if(v!=f && v!=wson[u]){
dsu(v,u,0);
}
}
if(wson[u]) dsu(wson[u],u,1),bj[wson[u]]=1;
solve(u,f,1);
for(int i=0;i<g[u].size();++i){
int id=g[u][i].first;
int d=g[u][i].second;
ans[id]=cnt[d+dep[u]];
}
if(wson[u]) bj[wson[u]]=0;
if(k==0) solve(u,f,-1);
}
int main(){
ios ::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i){
cin>>s[i];
cin>>x[i];
e[x[i]].push_back(i);
}
cin>>m;
for(int i=1;i<=m;++i){
int v,p;
cin>>v>>p;
g[v].push_back({i,p});
}
dfs(0,0);
dsu(0,0,1);
for(int i=1;i<=m;++i){
cout<<ans[i]<<'\n';
}
return 0;
}
TLE #62