记录编号 272525 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.500 s
提交时间 2016-06-17 07:06:16 内存使用 4.90 MiB
显示代码纯文本
#include<cstdio>
int ufs[300005];
bool incircle[300005];
/*int find(int x){
	if(x!=ufs[x])ufs[x]=find(ufs[x]);
	incircle[x]=incircle[ufs[x]];
	return ufs[x];
}*/
inline int find(int x){
	int v=x;
	while(v!=ufs[v])v=ufs[v];
	int rt=v;
	v=x;
	while(v!=ufs[v]){
		incircle[v]=incircle[rt];
		x=ufs[v];
		ufs[v]=rt;
		v=x;
	}
	return ufs[x];
}
inline void link(int a,int b){
	if(find(a)==find(b)){
		incircle[find(b)]=true;
		incircle[find(a)]=true;
	}
	ufs[find(a)]=find(b);
}
bool circle=false;//当前是否存在环
int root;//若存在环,约定环的“代表”在哪 
int to[300005];int ans[300005];int anslen=0;
bool destroy[300005];
int query[300005],len=1;
int read(){
	char ch;int x;
	while(ch=getchar(),ch>'9'||ch<'0');
	x=ch-'0';
	while(ch=getchar(),ch<='9'&&ch>='0')x=x*10+ch-48;
	return x;
}
int main(){
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	int n;n=read();
	for(int i=1;i<=n;++i){
		ufs[i]=i;
	}
	for(int i=1;i<=n;++i){
		to[i]=read();
		if(to[i]==0)destroy[i]=true;
	}	
	int m;m=read();int x,y;
	for(int i=1;i<=m;++i){
		x=read();y=read();
		if(x==1)query[len++]=y;//正值:查询终点 
		else {
			query[len++]=-y;//负值:删除出边 
			destroy[y]=true;
		}
	}
	
	for(int i=1;i<=n;++i){
		if(!destroy[i]){
			link(i,to[i]);		
		}
	}
	for(int i=len-1;i>=1;i--){
		if(query[i]>0){
			if(incircle[find(query[i])])ans[anslen++]=-1;
			else ans[anslen++]=find(query[i]);
		}else{
			int y=-query[i];
			link(y,to[y]);
		}
	}
	for(int i=anslen-1;i>=0;--i){
		if(ans[i]==-1)printf("CIKLUS\n");
		else printf("%d\n",ans[i]);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}