#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 2e5 + 5;
const int R = 25005;
const int S = 500;
int n, r, q, in[N], out[N], T = 0, c[N],id[N], hid = 0;
int Hea[S][R], cnt[R];
vector<int> g[N];
vector<pair<int,int>> reg[R];
void dfs(int x,int p = 0){
in[x] = ++T;
for(int j : g[x]) if(j != p){
dfs(j,x);
}
out[x] = ++T;
}
void Dfs(int x, int ty, int de){
if(c[x] == ty) de++;
Hea[id[ty]][c[x]] += de;
for(int i : g[x]) Dfs(i,ty,de);
}
int main(){
ios::sync_with_stdio(0);cin.tie(0);
cin >> n >> r >> q;
int x;cin >> c[1];
for(int i = 2 ; i <= n ; ++i){
cin >> x >> c[i];
g[x].push_back(i);
cnt[c[i]]++;
}
dfs(1);
for(int i = 1 ; i <= n ; ++i) reg[c[i]].push_back({in[i],out[i]});
for(int i = 1 ; i <= r ; ++i)
if((int)cnt[i] >= S) {
id[i] = hid++;
Dfs(1,i,0);
}
int u, v;
while(q--){
cin >> u >> v;
if((int)cnt[u] >= S){
cout << Hea[id[u]][v] << endl;
}
else{
int ans = 0;
for(pair<int,int> i : reg[u]){
// cout <<lower_bound(reg[v].begin(),reg[v].end(),make_pair(i.second,0)) - reg[v].begin() << ' '
// << lower_bound(reg[v].begin(),reg[v].end(),make_pair(i.first,0)) - reg[v].begin() << '\n';
ans += lower_bound(reg[v].begin(),reg[v].end(),make_pair(i.second,0))
- lower_bound(reg[v].begin(),reg[v].end(),make_pair(i.first,0));
}
cout << ans << endl;
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |