#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<ll>> v, ans;
vector<ll> H, t, ch;
vector<map<ll, ll>> m;
void DFS1(ll x, ll y){
ll mx = 0;
for(ll z : v[y]){
if(z==x){continue;}
DFS1(y, z);
t[y] += t[z];
if(mx < t[z]){
ch[y] = z;
mx = t[z];
}
}
}
void DFS2(ll x, ll y){
for(ll z : v[y]){
if(z==x){continue;}
DFS2(y, z);
}
swap(m[y], m[ch[y]]);
for(ll z : v[y]){
if(z==x){continue;}
m[y][H[z]]++;
if(z==ch[y]){continue;}
for(pair<ll, ll> p : m[z]){
m[y][p.first] += p.second;
}
}
for(pair<ll, ll> p : m[y]){
ans[H[y]][p.first] += p.second;
}
}
int main() {
cin.tie(nullptr);
ios_base::sync_with_stdio(false);
ll N, R, Q, s, r1, r2;
cin>>N>>R>>Q;
ans.resize(R, vector<ll>(R, 0));
v.resize(N);
H.resize(N);
t.resize(N, 1);
ch.resize(N);
m.resize(N);
cin>>H[0];
H[0]--;
for(ll i=1;i<N;i++){
cin>>s>>H[i];
s--; H[i]--;
v[s].push_back(i);
}
DFS1(-1, 0);
DFS2(-1, 0);
while(Q--){
cin>>r1>>r2;
r1--; r2--;
cout<<ans[r1][r2]<<endl;
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |