#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
const int sqr=200;
vector<int> vi[MAXN],ds[MAXN],vv[MAXN];
int L[MAXN],R[MAXN],pos[MAXN],cnt[MAXN],val[MAXN],dp[MAXN],ans[MAXN/sqr+5][MAXN/8],tdfs=0;
void dfs(int i,int pre)
{
vi[val[i]].push_back(L[i]=++tdfs);
vv[val[i]].push_back(i);
for(auto v:ds[i]) if(v!=pre) dfs(v,i);
R[i]=tdfs;
}
void dfs2(int i,int pre)
{
for(auto v:ds[i]) if(v!=pre)
{
dp[v]+=dp[i];
dfs2(v,i);
}
}
int main()
{
int n,r,q;
cin>>n>>r>>q;
for(int i=1;i<=n;i++)
{
if(i>1)
{
int res;
cin>>res;
ds[res].push_back(i);
}
cin>>val[i];
cnt[val[i]]++;
}
int c=0;
dfs(1,1);
for(int i=1;i<=r;i++) if(cnt[i]>=sqr)
{
pos[++c]=i;
for(int j=1;j<=n;j++) dp[j]=(val[j]==i);
dfs2(1,1);
for(int j=1;j<=n;j++) ans[c][val[j]]+=dp[j];
}
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
if(cnt[x]>=sqr)
{
int p=lower_bound(pos+1,pos+c+1,x)-pos;
cout<<ans[p][y]<<endl;
}
else
{
int a=0;
for(auto v:vv[x])
{
a+=(upper_bound(vi[y].begin(),vi[y].end(),R[v])-vi[y].begin());
a-=(lower_bound(vi[y].begin(),vi[y].end(),L[v])-vi[y].begin());
}
cout<<a<<endl;
}
fflush(stdout);
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |