比赛 |
20120612 |
评测结果 |
AAAAAAAAAA |
题目名称 |
石木游戏 |
最终得分 |
100 |
用户昵称 |
ZhouHang |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-06-12 19:40:03 |
显示代码纯文本
/**
*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();
scanf("%d",&x);
scanf("%d",&a[x]);
int ans=0;
for (int k=1; k<=n; k++)
if ( (num[k]%2)==0 )
ans^=(a[k]%(l+1));
if (ans==0) printf("No\n");
else printf("Yes\n");
int tmp;
for (int i=2; i<=T; i++)
{
scanf("%d",&x);
scanf("%d",&tmp);
if ( (num[x]%2)==0 )
{
ans^=(a[x]%(l+1));
ans^=(tmp%(l+1));
}
if (ans==0) printf("No\n");
else printf("Yes\n");
a[x]=tmp;
}
fclose(stdin); fclose(stdout);
return 0;
}