Submission #1314099

#TimeUsernameProblemLanguageResultExecution timeMemory
1314099boclobanchatRegions (IOI09_regions)C++20
100 / 100
3585 ms85580 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...