比赛 20120612 评测结果 RRRRRRRRRRRRR
题目名称 政党 最终得分 0
用户昵称 ZhouHang 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2012-06-12 18:10:37
显示代码纯文本
/**
*Prob : rocks
*Data : 2012-6-12
*Sol  : Nim游戏+SG函数
*/

#include <algorithm>
#include <string>
#include <iostream>
#include <cstdio>
#include <cstring>

#define MaxN 100100

using namespace std;

struct edge
{
	int y,next;
} e[MaxN];
int n,t,l,ans,now,T,x,tot=0;
int first[MaxN],h[MaxN],num[MaxN],a[MaxN];

void add(int x,int y)
{
	e[++tot].next=first[x]; 
	e[tot].y=y;
	first[x]=tot;
}

void init()
{
	memset(h,0,sizeof(h));
	int open=1,closd=0;
	h[1]=1; num[1]=1;
	int tmn,tme;
	while (closd<open)
	{
		tmn=h[++closd];
		tme=first[tmn];
		while (tme!=0)
		{
			int tmy=e[tme].y;
			h[++open]=tmy;
			num[tmy]=num[tmn]+1;
			tme=e[tme].next;
		}
	}
}

int main()
{
	freopen("rocks.in","r",stdin);
	freopen("rocks.out","w",stdout);
	
	
	scanf("%d%d%d",&n,&T,&l);
	
	for (int i=1; i<n; i++)
	{
		scanf("%d%d",&x,&a[i+1]);
		add(x,i+1);
	}
	
	init();
	
	for (int i=1; i<=T; i++)
	{
		scanf("%d",&x);
		scanf("%d",&a[x]);
		int ans=0;
		
		for (int k=1; k<=n; k++)
			if ((num[k]&1)==0) ans^=(a[k]%(l+1));
		
		if (ans==0) printf("NO\n");
		else printf("YES\n");
	}
  
	fclose(stdin); fclose(stdout);
	return 0;
}