This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
int n, r, q;
vector<int> home, rid;
vector<vector<int>> reverse_super, conn, tot;
vector<pair<pair<int, int>, int>> euler;
int timer = 0;
void euler_tour(int at) {
euler[at].first.first = timer;
euler[timer].second = at;
conn[home[at]].push_back(timer);
timer++;
for (int u : reverse_super[at]) {
euler_tour(u);
}
euler[at].first.second = timer;
}
void dfs(int x, int parreg, int parc){
if(home[x]==parreg){
parc++;
}
tot[rid[parreg]][home[x]]+=parc;
for(auto u : reverse_super[x]) dfs(u, parreg, parc);
}
signed main(){
cin >> n >> r >> q;
home.resize(n+1);
reverse_super.resize(n+1);
euler.resize(n+1);
conn.resize(r+1);
rid.resize(r+1);
cin >> home[0]; home[0]--;
for(int i = 1; i < n; i++){
int super;
cin >> super >> home[i];super--; home[i]--;
reverse_super[super].push_back(i);
}
euler_tour(0);
int a=0;
for(int i=0;i<r;i++){
if(conn[i].size()>1000){
rid[i]=a;
a++;
tot.push_back(vector<int>(r));
dfs(0, i, 0);
}
}
int r1, r2;
for(int i = 0; i < q; i++){
cin >> r1 >> r2;r1--;r2--;
if(conn[r1].size()>1000){
cout << tot[rid[r1]][r2] << "\n";
continue;
}
int ans = 0;
for(auto u : conn[r1]){
ans +=lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.second)
-lower_bound(conn[r2].begin(), conn[r2].end(), euler[euler[u].second].first.first);
}
cout << ans << "\n";
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |