#include<bits/stdc++.h>
using namespace std;
vector<int>adj[200005];
int ar[200005];
int cnt[200005];
int ans[505][200005];
int tot;
int X=500;
vector<int>v[200005];
vector<int>v2[200005];
int in[200005];
int out[200005];
int tme=0;
vector<int>big;
void dfs(int u,int t,int tt){
ans[t][ar[u]]+=tot;
if(ar[u]==tt)tot++;
for(auto x:adj[u])dfs(x,t,tt);
if(ar[u]==tt)tot--;
}
void efs(int u){
in[u]=++tme;
//cerr<<"u:"<<u<<" "<<in[u]<<"\n";
v[ar[u]].push_back(tme);
v2[ar[u]].push_back(u);
for(auto x:adj[u])efs(x);
out[u]=tme;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
int n,r,q;cin>>n>>r>>q;
for(int i=1;i<=n;i++){
if(i==1)cin>>ar[i];
else{
int x;cin>>x;
adj[x].push_back(i);
cin>>ar[i];
cnt[ar[i]]++;
}
}
int cur=0;
for(int i=1;i<=r;i++){
if(cnt[i]>X){
big.push_back(i);
dfs(1,cur,i);
cur++;
}
}
efs(1);
for(int i=0;i<q;i++){
int r1,r2;cin>>r1>>r2;
if(cnt[r1]>X){
r1=lower_bound(big.begin(),big.end(),r1)-big.begin();
cout<<ans[r1][r2]<<endl;
}else{
int rans=0;
for(auto x:v2[r1]){
//cerr<<"add:"<<in[x]+1<<" "<<out[x]<<"\n";
int st=upper_bound(v[r2].begin(),v[r2].end(),in[x])-v[r2].begin()+1;
int en=upper_bound(v[r2].begin(),v[r2].end(),out[x])-v[r2].begin();
rans+=max(0,en-st+1);
}
cout<<rans<<endl;
}
}
}