记录编号 302410 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [HZOI 2016]tree—增强版 最终得分 100
用户昵称 GravatarDrench 是否通过 通过
代码语言 C++ 运行时间 7.552 s
提交时间 2016-09-04 09:45:54 内存使用 18.31 MiB
显示代码纯文本
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int father[1000005];
int root[1000005];
char oper[1000005];
int num[1000005];
int tag[1000005];
int ans[1000005];
int findset(int x)
{
	if(father[x]!=x)
		father[x]=findset(father[x]);
	return father[x];
}
int main()
{
	freopen("tree++.in","r",stdin);
	freopen("tree++.out","w",stdout);
	int __size__=64<<20;
	char *__p__=(char*)malloc(__size__)+__size__;
	__asm__("movl %0, %%esp\n"::"r"(__p__));
	int n,q;
	scanf("%d %d",&n,&q);
	father[1]=1;tag[1]=1;
	for(int i=1;i<n;i++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		//if(u>v) swap(u,v);
		father[v]=u;
	}	
	for(int i=1;i<=n;i++)
		root[i]=father[i];
	for(int i=q;i>=1;i--)
	{	
		char tmp=getchar();
		while(tmp!='C' && tmp!='Q')
			tmp=getchar();
		oper[i]=tmp;
		scanf("%d",&num[i]);
		if(oper[i]=='C') tag[num[i]]++;
	}
	for(int i=1;i<=n;i++)
		if(tag[i])
			father[i]=i;
	for(int i=1;i<=q;i++)
	{
		if(oper[i]=='Q')
			if(tag[num[i]])
				ans[i]=num[i];
			else
				ans[i]=findset(root[num[i]]);
		else if(oper[i]=='C')
		{
			tag[num[i]]--;
			if(!tag[num[i]]) 
				father[num[i]]=root[num[i]];
		}
	}
	for(int i=q;i>=1;i--)
		if(ans[i])
			printf("%d\n",ans[i]);
	fclose(stdin);
	fclose(stdout);
	return 0;
}