#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,a[N],siz[N],h[N],T,node,ans[N];
set<int>num[N];
stack<int>del;
map<string,int>mp;
vector<int>g[N],root;
vector<pair<int,int>>query[N];
int get(string name){
if(mp[name]){
return mp[name];
}
return mp[name]=++node;
}
void init(int u){
siz[u]=1;
for(int v:g[u]){
init(v),siz[u]+=siz[v];
if(siz[h[u]]<siz[v]){
h[u]=v;
}
}
}
void clear(){
while(del.size()){
int u=del.top();
num[u].clear(),del.pop();
}
}
void ins(int u,int x){
num[x].insert(a[u]),del.push(x);
}
void add(int u,int now){
ins(u,now);
for(int v:g[u]){
add(v,now+1);
}
}
void solve(int u){
for(int v:g[u]){
if(v!=h[u]){
solve(v),clear();
}
}
if(h[u]){
solve(h[u]);
}
for(int v:g[u]){
if(v!=h[u]){
add(v,1);
}
}
ins(u,0);
for(auto [val,id]:query[u]){
ans[id]=num[val].size();
}
}
int main(){
cin>>n;
for(int i=1,f;i<=n;i++){
string name;
cin>>name>>f,a[i]=get(name);
if(!f){
root.push_back(i);
}
else{
g[f].push_back(i);
}
}
cin>>T;
for(int u,x,i=1;i<=T;i++){
cin>>u>>x,query[u].push_back({x,i});
}
for(int i:root){
init(i),solve(i);
}
for(int i=1;i<=T;i++){
cout<<ans[i]<<'\n';
}
}