#include <bits/stdc++.h>
using namespace std;
int n, r, q, h[200001], timer = 0, tin[200001], tout[200001], tin_node[200001];
int region_id[25001], cnt[159][25001];
vector<int> child[200001], region[25001];
void dfs(int u) {
tin[u] = ++timer;
tin_node[tin[u]] = u;
region[h[u]].push_back(tin[u]);
for (int v: child[u])
dfs(v);
tout[u] = timer;
}
void dfs2(int u, int region_parent, int parent_cnt) {
if (h[u] == region_parent) parent_cnt++;
cnt[region_id[region_parent]][h[u]] += parent_cnt;
for (int v: child[u])
dfs2(v, region_parent, parent_cnt);
}
int main() {
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//freopen("test01.in", "r", stdin);
//freopen("test01.out", "w", stdout);
cin >> n >> r >> q;
cin >> h[1];
for (int i = 2; i <= n; i++) {
int si;
cin >> si >> h[i];
child[si].push_back(i);
}
dfs(1);
int block = sqrt(n), current_id = 0;
for (int i = 1; i <= r; i++)
if (region[i].size() >= block) {
region_id[i] = ++current_id;
dfs2(1, i, 0);
}
while (q--) {
int r1, r2;
cin >> r1 >> r2;
if (region[r1].size() >= block)
cout << cnt[region_id[r1]][r2] << "\n";
else {
int ans = 0;
for (int u: region[r1])
ans += lower_bound(region[r2].begin(), region[r2].end(), tout[tin_node[u]]) -
upper_bound(region[r2].begin(), region[r2].end(), tin[tin_node[u]]);
cout << ans << "\n";
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |