#include <bits/stdc++.h>
using namespace std;
void euler_tour(vector<vector<int>> &adj, vector<int> ®ion, int curr, int parent, int &timer, vector<int> &start, vector<int> &end, vector<int> &time_node, vector<vector<int>> &comp){
start[curr] = timer++;
time_node[start[curr]] = curr;
comp[region[curr]].push_back(start[curr]);
for (int next : adj[curr]) if (next != parent) euler_tour(adj, region, next, curr, timer, start, end, time_node, comp);
end[curr] = timer;
}
void dfs(vector<vector<int>> &adj, vector<int> ®ion, vector<int> ®ion_id, int curr, int parent, int parent_region, int parent_count, vector<vector<int>> &calc){
if (region[curr] == parent_region) parent_count++;
else calc[region_id[parent_region]][region[curr]] += parent_count;
for (int next : adj[curr]) if (next != parent) dfs(adj, region, region_id, next, curr, parent_region, parent_count, calc);
}
int main(){
int n, r, q;
cin >> n >> r >> q;
vector<int> region(n);
vector<vector<int>> adj(n);
cin >> region[0];
region[0]--;
for (int i = 1; i < n; i++){
int parent, home;
cin >> parent >> home;
parent--, home--;
region[i] = home;
adj[i].push_back(parent);
adj[parent].push_back(i);
}
int timer = 0;
vector<int> start(n), end(n), time_node(n);
vector<vector<int>> comp(r);
euler_tour(adj, region, 0, -1, timer, start, end, time_node, comp);
const int BLOCK = sqrt(n);
vector<int> region_id(r, -1);
vector<vector<int>> calc;
int curr_id = 0;
for (int i = 0; i < r; i++){
if ((int)comp[i].size() >= BLOCK){
region_id[i] = curr_id++;
calc.push_back(vector<int>(r, 0));
dfs(adj, region, region_id, 0, -1, i, 0, calc);
}
}
while (q--){
int r1, r2;
cin >> r1 >> r2;
r1--, r2--;
if (region_id[r1] != -1) cout << calc[region_id[r1]][r2] << endl;
else {
int total = 0;
for (int u : comp[r1]) total += lower_bound(comp[r2].begin(), comp[r2].end(), end[time_node[u]]) - lower_bound(comp[r2].begin(), comp[r2].end(), start[time_node[u]]);
cout << total << endl;
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |