#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
using ll = long long;
const ll SQRT = 500;
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
ll n, r, q;
cin >> n >> r >> q;
vector<vector<ll>> regions(r + 1), tins(r + 1);
vector<pair<ll, ll>> employees(n + 1);
vector<vector<ll>> adjacency(n + 1);
for (ll i = 1; i <= n; ++i) {
if (i > 1) {
cin >> employees[i].second >> employees[i].first;
adjacency[employees[i].second].push_back(i);
} else
cin >> employees[i].first;
regions[employees[i].first].push_back(i);
}
vector<ll> tin(n + 1), tout(n + 1);
ll cnt = 1;
auto euler = [&](ll cur, auto euler) -> void {
tin[cur] = cnt++;
tins[employees[cur].first].push_back(tin[cur]);
for (auto& i : adjacency[cur]) euler(i, euler);
tout[cur] = cnt++;
};
euler(1, euler);
for (auto& i : tins) sort(i.begin(), i.end());
vector<vector<ll>> heavy(r + 1);
auto dfs = [&](ll cur, ll pCnt, ll i, auto dfs) -> void {
if (employees[cur].first == i) ++pCnt;
heavy[i][employees[cur].first] += pCnt;
for (auto& j : adjacency[cur]) dfs(j, pCnt, i, dfs);
};
for (ll i = 1; i <= r; ++i) {
if (regions[i].size() < SQRT) continue;
heavy[i].assign(r + 1, 0);
dfs(1, 0, i, dfs);
}
while (q--) {
ll r1, r2;
cin >> r1 >> r2;
if (heavy[r1].size())
cout << heavy[r1][r2] << endl;
else {
ll res = 0;
for (auto& i : regions[r1])
res += upper_bound(tins[r2].begin(), tins[r2].end(), tout[i]) -
lower_bound(tins[r2].begin(), tins[r2].end(), tin[i]);
cout << res << endl;
}
}
return 0;
}