// Author: Teoman Ata Korkmaz
#include <bits/stdc++.h>
#define int int32_t
using namespace std;
constexpr int N=2e5+5;
constexpr int R=25000;
///////////////////////////////////////////////////////////
int n,m,q,p[N],c[N];
vector<vector<int>> ans;
vector<int> adj[N];
map<int,int> mp[N];
inline void dfs(int node){
// cerr<<"begin "<<node<<endl;
for(const auto i:adj[node]){
dfs(i);
if(mp[node].size()<mp[i].size())swap(mp[node],mp[i]);
for(const auto [k,v]:mp[i])mp[node][k]+=v;
}
for(const auto [k,v]:mp[node])ans[c[node]][k]+=v;
mp[node][c[node]]++;
// cerr<<"end "<<node<<endl;
// for(int i=0;i<m;i++){
// for(int j=0;j<m;j++){
// cerr<<ans[i][j]<<" ";
// }
// cerr<<endl;
// }
// cerr<<"end "<<node<<endl;
}
signed main(void){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>m>>q>>c[0];c[0]--;
for(int i=1;i<n;i++){
int x,y;
cin>>x>>y;
x--,y--;
p[i]=x;
c[i]=y;
adj[x].push_back(i);
}
ans.resize(m,vector<int>(m,0));
dfs(0);
// for(int i=0;i<m;i++){
// for(int j=0;j<m;j++){
// cerr<<ans[i][j]<<" ";
// }
// cerr<<endl;
// }
while(q--){
int x,y;
cin>>x>>y;
x--,y--;
cout<<ans[x][y]<<'\n'<<flush;
}
}