#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
vector<int> regions;
vector<vector<int>> graph;
int n, r, q;
vector<vector<long long>> counts;
vector<vector<int>> employees;
void pref(vector<long long> &vec, int check, int num, int node) {
int t = num;
if (regions[node] == check) {
t++;
} else {
vec[regions[node]] += num;
}
for (auto next : graph[node]) {
pref(vec, check, t, next);
}
}
map<int, int> big_i;
vector<int> on;
vector<int> off;
vector<vector<long long>> arr;
int t;
void walk(int node) {
on[node] = t;
t++;
arr[regions[node]].push_back(on[node]);
for (auto next : graph[node]) {
walk(next);
}
t++;
off[node] = t;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n >> r >> q;
regions.resize(n);
graph.resize(n);
cin >> regions[0];
employees.resize(r);
regions[0]--;
employees[regions[0]].push_back(0);
for (int i = 1; i < n; i++) {
int c;
cin >> c;
graph[--c].push_back(i);
cin >> regions[i];
employees[--regions[i]].push_back(i);
}
for (int i = 0 ; i < r; i++) {
if (employees[i].size()>= 500) {
vector<long long> vec(r);
pref(vec, i, 0, 0);
big_i[i] = counts.size();
counts.push_back(vec);
}
}
arr.resize(r); on.resize(n); off.resize(n);
t = 0;
walk(0);
for (int i = 0; i < q; i++) {
int r1, r2;
cin >> r1 >> r2;
r1--; r2--;
if (employees[r1].size() >= 500) {
cout << counts[big_i[r1]][r2] << endl;
cout.flush();
} else {
long long sum = 0;
for (auto val : employees[r1]) {
sum += lower_bound(arr[r2].begin(), arr[r2].end(), off[val]) - lower_bound(arr[r2].begin(), arr[r2].end(), on[val]);
}
cout << sum << endl;
cout.flush();
}
}
}