记录编号 330895 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatar哒哒哒哒哒! 是否通过 通过
代码语言 C++ 运行时间 1.223 s
提交时间 2016-10-26 21:32:19 内存使用 5.19 MiB
显示代码纯文本
#include <queue>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
#define ll long long 
int read(){
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
	return x*f;
}
const int maxn=301000;
int fa[maxn],to[maxn],query[maxn],ans[maxn],len;
bool stop[maxn],del[maxn],cir[maxn];

int find(int x){
	int r=x;
	while(r!=fa[r]) r=fa[r];
	while(x!=fa[x]){
		cir[x]=cir[r];
		fa[x]=r,x=fa[x];
	}
	return fa[x];
}
void unioon(int a,int b){
	int ra=find(a),rb=find(b);
	if(ra==rb) cir[ra]=cir[rb]=1;
	fa[ra]=rb;
}
int main(){
	freopen("marbles.in","r",stdin);freopen("marbles.out","w",stdout);
	int n=read();
	for(int i=1;i<=n;i++){
		to[i]=read();if(!to[i]) stop[i]=1;
	}
	for(int i=1;i<=n;i++)fa[i]=i;
	int m=read();
	for(int i=1;i<=m;i++){
		int op=read(),x=read();query[i]=x;
		if(op==2) del[x]=1,query[i]=-x;
	}
	for(int i=1;i<=n;i++)if(!del[i]&&to[i])unioon(i,to[i]);
	for(int i=m;i>=1;i--){
		if(query[i]>0){
			int rx=find(query[i]);
			if(cir[rx]) ans[++len]=-1;
			else ans[++len]=rx;
		}else{
			int y=-query[i];
			unioon(y,to[y]);
		}
	}
	for(int i=len;i>=1;i--){
		if(ans[i]==-1)printf("CIKLUS\n");
		else printf("%d\n",ans[i]);
	}
	fclose(stdin);fclose(stdout);
	return 0;
}