记录编号 155901 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAATAA
题目名称 [IOI 2009]区域发展 最终得分 96
用户昵称 GravatarTA 是否通过 未通过
代码语言 C++ 运行时间 35.080 s
提交时间 2015-03-31 20:32:40 内存使用 14.91 MiB
显示代码纯文本
#include<cstdio> 
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline int in(){
	char c=getchar();
	int x=0;
	while(c<'0'||c>'9')c=getchar();
	for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
	return x;
}
int H[200005];
#include<vector>
vector<int> son[200005];
struct QS{
	int r1,r2,i;
	long long ans;
	inline bool operator < (const QS a) const{
		return r1!=a.r1?r1<a.r1:r2<a.r2;
	}
	inline bool operator != (const QS a) const{
		return r1!=a.r1||r2!=a.r2;
	}
	inline bool operator == (const QS a) const{
		return r1==a.r1&&r2==a.r2;
	}
}query[200005];;
vector<int> qc[25005],qi[25005];
long long ans[200005];
int sum[25005];
int pc[200005],pi[200005],qs[25005],qt[25005];
int ps[200005],ss[200005],st[200005];
#include<cstdlib>
int soni[200005],fa[200005];
int main(){
	freopen("region.in","r",stdin);
	freopen("region.out","w",stdout);
	int N=in(),R=in(),Q=in(),i,j;
	H[1]=in();
	for(i=2;i<=N;++i)fa[i]=in(),son[fa[i]].push_back(i),H[i]=in();
	for(i=0;i<Q;++i)query[i].r1=in(),query[i].r2=in(),query[i].i=i;
	sort(query,query+Q);
	for(i=0;i<Q;++i)
		if(query[i]!=query[i+1])
			qc[query[i].r2].push_back(query[i].r1),qi[query[i].r2].push_back(i);
	int tot=0;
	for(i=1;i<=R;++i){
		qs[i]=tot;
		qt[i]=tot+qc[i].size();
		for(j=qc[i].size();j--;)pc[tot]=qc[i][j],pi[tot++]=qi[i][j];
	}
	tot=0;
	for(i=1;i<=N;++i){
		ss[i]=tot,st[i]=tot+son[i].size();
		for(j=son[i].size();j--;)ps[tot++]=son[i][j];
	}
	
	memset(soni,-1,sizeof(soni));
	for(int x=1;x;)
		if(soni[x]<0){
			for(i=qs[H[x]];i<qt[H[x]];++i)query[pi[i]].ans+=sum[pc[i]];
			++sum[H[x]];
			soni[x]=st[x];
		}
		else if(soni[x]>ss[x])x=ps[--soni[x]];
		else{
			--sum[H[x]];
			x=fa[x];
		}
	
	for(i=Q;i--;){
		if(query[i]==query[i+1])query[i].ans=query[i+1].ans;
		ans[query[i].i]=query[i].ans;
	}
	for(i=0;i<Q;++i)printf("%lld\n",ans[i]);
}