rt
//From: ifffer_2137
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x7fffffff
#define DEBUG puts("DEBUG")
inline int read(){
char ch=getchar();int x=0,w=1;
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+ch-48,ch=getchar();return w==1?x:-x;
}
const int maxn=1e5+5;
int n,m,mx;
int ans[maxn];
map<string,int> mp;
int c[maxn],tot;
int fa[maxn],dep[maxn],dfn[maxn],nfd[maxn],dfc;
int t[maxn],pre[maxn];
vector<int> tr[maxn],pt[maxn];
bool cmp1(int a,int b){
return dfn[a]<dfn[b];
}
void dfs(int u){
if(fa[u]!=-1){
dep[u]=dep[fa[u]]+1;
mx=max(mx,dep[u]);
}
dfn[u]=++dfc;
pt[dep[u]].push_back(u);
for(unsigned int i=0;i<tr[u].size();i++){
int v=tr[u][i];
if(v==fa[u]) continue;
dfs(v);
}
nfd[u]=dfc;
}
struct ask{
int id;
int x,k;
};
vector<ask> q[maxn];
bool cmp2(ask a,ask b){
return nfd[a.x]<nfd[b.x];
}
struct Segment_Tree{
int sumv[maxn*4];
void pushup(int o){
sumv[o]=sumv[o*2]+sumv[o*2+1];
}
void update(int o,int l,int r,int x,int k){
if(l==r){
sumv[o]+=k;
return;
}
int m=(l+r)/2;
if(x<=m) update(o*2,l,m,x,k);
else update(o*2+1,m+1,r,x,k);
pushup(o);
}
int query(int o,int l,int r,int x,int y){
if(x<=l&&r<=y){
return sumv[o];
}
int m=(l+r)/2,res=0;
if(x<=m) res+=query(o*2,l,m,x,y);
if(y>m) res+=query(o*2+1,m+1,r,x,y);
return res;
}
}seg;
void solve(int d){
if(q[d].empty()) return;
sort(q[d].begin(),q[d].end(),cmp2);
for(unsigned int i=0;i<pt[d].size();i++){
int u=pt[d][i];
pre[i]=t[c[u]]=-1;
}
for(unsigned int i=0;i<pt[d].size();i++){
int u=pt[d][i];
pre[i]=t[c[u]];
t[c[u]]=i;
}
int ch=-1;
for(unsigned int i=0;i<q[d].size();i++){
while(ch==-1||(ch+1<(int)pt[d].size()&&dfn[pt[d][ch]]<nfd[q[d][i].x])){
seg.update(1,1,dfc,dfn[pt[d][++ch]],1);
if(pre[ch]!=-1){
seg.update(1,1,dfc,dfn[pt[d][pre[ch]]],-1);
}
}
ans[q[d][i].id]=seg.query(1,1,dfc,dfn[q[d][i].x],nfd[q[d][i].x]);
}
for(unsigned int i=0;i<pt[d].size();i++){
if(seg.query(1,1,dfc,dfn[pt[d][i]],dfn[pt[d][i]])){
seg.update(1,1,dfc,dfn[pt[d][i]],-1);
}
}
}
signed main(){
cin.tie(0),cout.tie(0);
n=read();
for(int i=1;i<=n;i++){
string id;
cin>>id;
if(!mp[id]) mp[id]=++tot;
c[i]=mp[id];
fa[i]=read();
tr[fa[i]].push_back(i);
tr[i].push_back(fa[i]);
}
fa[0]=-1;
dfs(0);
for(int i=1;i<=mx;i++){
sort(pt[i].begin(),pt[i].end(),cmp1);
}
m=read();
for(int i=1;i<=m;i++){
ask a;
a.id=i;
a.x=read(),a.k=read();
if(dep[a.x]+a.k<=mx) q[dep[a.x]+a.k].push_back(a);
}
for(int i=1;i<=mx;i++){
solve(i);
}
for(int i=1;i<=m;i++){
cout<<ans[i]<<endl;
}
return 0;
}