记录编号 235063 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatar洛克索耶夫 是否通过 通过
代码语言 C++ 运行时间 0.563 s
提交时间 2016-03-10 10:25:41 内存使用 6.61 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;

int ans[300100]={0},to[300100]={0},root[300100]={0};
int ope1[300100]={0},ope2[300100]={0};
bool isdel[300100]={false},incircle[300100]={false};

int Read()
{
	char ch=getchar();
	int a=0;
	while(ch<'0'||ch>'9')	ch=getchar();
	while(ch>='0'&&ch<='9'){
		a=a*10+ch-'0';
		ch=getchar();
	}
	return a;
}

inline int FindRoot(int a)
{
	if(root[a]!=a){
		root[a]=FindRoot(root[a]);
		incircle[a]=incircle[root[a]];
	}	
	return root[a];
}

inline void Union(int a, int b)
{	
	int ra=FindRoot(a),rb=FindRoot(b);
	if(ra==rb)	incircle[a]=incircle[b]=true;
	else root[rb]=ra;
}

int main()
{	
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	memset(isdel,false,sizeof(isdel));
	memset(incircle,false,sizeof(incircle));
	int N,M;
	N=Read();
	for(int i=1;i<=N;i++)	root[i]=i;
	for(int i=1;i<=N;i++)	to[i]=Read();
	M=Read();
	for(int i=1;i<=M;i++){
		ope1[i]=Read();ope2[i]=Read();
		if(ope1[i]==2)	isdel[ope2[i]]=true;
	}
	for(int i=1;i<=N;i++){
		if(!isdel[i]&&to[i]!=0)	Union(to[i],i);
			//printf("root%d:%d\n",i,root[i]);
			//printf("\n\n");
	}
	for(int i=M;i>=1;i--){
		for(int j=M;j>=1;j--){
			//printf("root%d:%d\n",ope2[j],root[ope2[j]]);
			//printf("circle%d:%d\n"),ope2[j],incircle[ope2[j]];
		}printf("\n\n");
		if(ope1[i]==2)	Union(to[ope2[i]],ope2[i]);	
		else{
			FindRoot(ope2[i]);
			if(incircle[ope2[i]])	ans[i]=-1;
			else ans[i]=FindRoot(ope2[i]);
		}	
	} 
	for(int i=1;i<=M;i++){
		if(ans[i]==-1)	printf("CIKLUS\n");
		if(ans[i]>0)	printf("%d\n",ans[i]);
	}
	return 0; 
}