rt
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,m;
int cnt[N],ans[N];
map<string,int>mp[N];
struct query{int k,id;};
string na[N];
vector<int>root,edge[N];
vector<query>q[N];
int sz[N],son[N],dep[N];
int heavy;
void dfs1(int u,int fa)
{
dep[u]=dep[fa]+1;
sz[u]=1,son[u]=-1;
for(auto &v:edge[u])
{
if(v==fa)
continue;
dfs1(v,u);
sz[u]+=sz[v];
if(son[u]==-1||sz[v]>sz[son[u]])
son[u]=v;
}
}
void update(int u,int fa,int val)
{
if(val==1)
{
if(!mp[dep[u]][na[u]])
++cnt[dep[u]];
++mp[dep[u]][na[u]];
}
if(val==-1)
{
--mp[dep[u]][na[u]];
if(!mp[dep[u]][na[u]])
--cnt[dep[u]];
}
for(auto &v:edge[u])
{
if(v==fa||v==heavy)
continue;
update(v,u,val);
}
}
void getans(int u)
{
for(int i=0;i<(int)q[u].size();++i)
{
int k=q[u][i].k,id=q[u][i].id;
if(dep[u]+k>n)
ans[id]=0;
else
ans[id]=cnt[dep[u]+k];
}
}
void dfs2(int u,int fa,int big)
{
for(auto &v:edge[u])
if(v!=fa&&v!=son[u])
dfs2(v,u,0);
if(~son[u])
dfs2(son[u],u,1);
heavy=son[u];
update(u,fa,1);
getans(u);
heavy=0;
if(!big)update(u,fa,-1);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for(int i=1;i<=n;++i)
{
int f;
cin>>na[i]>>f;
if(f)edge[f].emplace_back(i);
else root.emplace_back(i);
}
cin>>m;
for(int i=1;i<=m;++i)
{
int u,k;
cin>>u>>k;
q[u].emplace_back((query){k,i});
}
for(auto &rt:root)
{
dfs1(rt,0);
dfs2(rt,0,0);
}
for(int i=1;i<=m;++i)
cout<<ans[i]<<'\n';
}