#include <iostream>
#include <vector>
#include <algorithm>
typedef long long ll;
const int maxn = 5 + 2e5, maxr = 25005;
std::vector<int> edges[maxn];
int vert[maxn], tin[maxn], tout[maxn], timer = 0;
void dfs(int u) {
tin[u] = ++timer;
for (int v : edges[u])
dfs(v);
tout[u] = timer;
}
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr), std::cout.tie(nullptr);
int n, r, q;
std::cin >> n >> r >> q;
std::vector<std::vector<int>> reg(r + 1);
std::cin >> vert[1];
reg[vert[1]].push_back(1);
for (int i = 2; i <= n; i++) {
int par;
std::cin >> par >> vert[i];
reg[vert[i]].push_back(i);
edges[par].push_back(i);
}
dfs(1);
std::vector<std::vector<int>> reg_timer(r + 1);
for (int i = 1; i <= r; i++) {
std::sort(reg[i].begin(), reg[i].end(),
[](int &a, int &b) { return tin[a] < tin[b]; });
reg_timer[i].reserve(reg[i].size());
for (int &v : reg[i])
reg_timer[i].push_back(tin[v]);
}
while (q--) {
int r1, r2;
std::cin >> r1 >> r2;
ll ans = 0;
for (int &u : reg[r1]) {
int left =
std::lower_bound(reg_timer[r2].begin(), reg_timer[r2].end(), tin[u]) -
reg_timer[r2].begin();
int right = std::upper_bound(reg_timer[r2].begin(), reg_timer[r2].end(),
tout[u]) -
reg_timer[r2].begin();
ans += right - left;
}
std::cout << ans << std::endl;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |