#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> graph;
vector<vector<int>> regs;
int tin[200005], tout[200005];
int reg[200005];
int num_reg[200005];
int t = 0, cnt = 0;
int vec[25005];
int idx[25005];
int res[505][25005];
int n, r, q;
void dfs(int v)
{
tin[v] = t++;
if(num_reg[reg[v]] >= 500)
{
if(idx[reg[v]] == -1) idx[reg[v]] = cnt++;
for(int i = 0; i < r; i++) res[idx[reg[v]]][i] += vec[i];
}
for(int i : graph[v]) dfs(i);
vec[reg[v]]++;
tout[v] = t++;
}
signed main()
{
cin.tie(0)->sync_with_stdio(0);
cin >> n >> r >> q;
graph.resize(n);
regs.resize(r);
cin >> reg[0];
reg[0]--;
regs[reg[0]].push_back(0);
for(int i = 1; i < n; i++)
{
int a;
cin >> a;
a--;
graph[a].push_back(i);
cin >> reg[i];
reg[i]--;
regs[reg[i]].push_back(i);
num_reg[reg[i]]++;
}
fill(idx, idx + r, -1);
dfs(0);
for(int i = 0; i < r; i++) sort(regs[i].begin(), regs[i].end(), [&](int a, int b){return tin[a] < tin[b];});
while(q--)
{
int r1, r2;
cin >> r1 >> r2;
r1--, r2--;
if(num_reg[r1] >= 500) cout << res[idx[r1]][r2] << endl;
else
{
int res = 0;
for(int i : regs[r1])
{
res += lower_bound(regs[r2].begin(), regs[r2].end(), tout[i], [&](int a, int b){return tin[a] < b;}) -
lower_bound(regs[r2].begin(), regs[r2].end(), tin[i], [&](int a, int b){return tin[a] < b;});
}
cout << res << endl;
}
}
return 0;
}