#include<bits/stdc++.h>
using namespace std;
int h[200007];
vector<int> home[25007];
vector<int> vec[200007];
vector<int> tour;
int timer=1;
pair<int,int> inout[200007];
vector<int> touridx[25007];
void dfs(int x){
tour.push_back(h[x]);
inout[x].first=timer;
++timer;
for(auto i:vec[x]){
if(inout[i].first) continue;
dfs(i);
}
tour.push_back(0);
inout[x].second=timer;
++timer;
}
int n,r,q;
int dp[300][25007];
int run;
bool visited[200007];
int idx[25007];
int idxback[25007];
void predfs(int node,int pr,int prcnt){
if(prcnt && pr && h[node]) dp[run][h[node]]+=prcnt;
if(h[node]==pr) ++prcnt;
visited[node]=true;
for(auto i:vec[node]){
if(visited[i]) continue;
predfs(i,pr,prcnt);
}
}
void precompute(){
run=0;
for(int rg=1;rg<=r;++rg){
if(touridx[rg].size()<sqrt(n)) continue;
memset(visited,0,sizeof(visited));
predfs(1,rg,0);
idx[run]=rg;
idxback[rg]=run;
++run;
}
}
int dynamic(int r1,int r2){
if(touridx[r1].size()>=sqrt(n)) return dp[idxback[r1]][r2];
int ans=0;
for(auto i:home[r1]){
ans+=upper_bound(touridx[r2].begin(),touridx[r2].end(),inout[i].second)-lower_bound(touridx[r2].begin(),touridx[r2].end(),inout[i].first);
}
return ans;
}
signed main(){
cin >> n >> r >> q;
cin >> h[1];
for(int i=2;i<=n;++i){
int s; cin >> s >> h[i];
vec[i].push_back(s);
vec[s].push_back(i);
}
for(int i=1;i<=n;++i){
home[h[i]].push_back(i);
}
tour.push_back(0);
dfs(1);
for(int i=0;i<tour.size();++i) touridx[tour[i]].push_back(i);
precompute();
while(q--){
int r1,r2; cin >> r1 >> r2;
/*
int ans=0;
*/
// Size log n - per r1 r2
// Size * n - per r1 xx
cout << dynamic(r1,r2) << endl;
}
}