记录编号 235120 评测结果 WWWWWWWWAW
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 10
用户昵称 Gravatar水墨青花 是否通过 未通过
代码语言 C++ 运行时间 1.537 s
提交时间 2016-03-10 11:03:53 内存使用 6.66 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;

struct NODE
{
	int to;
	int father;
	bool del;
	bool incir;
	
	NODE()
	{
		to=0;
		father=0;
		del=false;
		incir=false;
	}
}e[300001];

void Read();
void Work();
void Union(int,int);
int Findroot(int);

int n,q;
int ope[3][300001];
int ans[300001];

int main()
{
	freopen("marbles.in","r",stdin);
	freopen("marbles.out","w",stdout);
	
	memset(ope,0,sizeof(ope));
	memset(ans,0,sizeof(ans));
	
	Read();
	Work();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}

void Read()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		e[i].father=i;
	}
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&e[i].to);
		if(e[i].to==0)
		{
			e[i].del=true;
		}
	}
	
	scanf("%d",&q);
	for(int i=1;i<=q;i++)
	{
		scanf("%d",&ope[1][i]);
		if(ope[1][i]==1)
		{
			scanf("%d",&ope[2][i]);
		}
		else
		{
			scanf("%d",&ope[2][i]);
			e[ope[2][i]].del=true;
		}
	}
}

void Work()
{
	for(int i=1;i<=n;i++)
	{
		if(!e[i].del)
		{
			Union(i,e[i].to);
		}
	}
	for(int i=1;i<=n;i++)
	{
	//	cout<<i<<' '<<e[i].to<<' '<<e[i].father<<endl;
		if(e[i].incir)
		{
			cout<<"aaa";
		}
	}
	
	for(int i=q;i>=1;i--)
	{
		if(ope[1][i]==1)
		{
			if(e[Findroot(ope[2][i])].incir)
			{
				ans[i]=-1;
			}
			else
			{
				ans[i]=Findroot(ope[2][i]);
			}
		}
		else
		{
			Union(ope[2][i],e[ope[2][i]].to);
		}
	}
	
	for(int i=1;i<=q;i++)
	{
		if(ope[1][i]==2)
		{
			continue;
		}
		else
		{	
			if(ans[i]<0)
			{
				printf("CIKLUS\n");
			}
			else
			{
				printf("%d\n",ans[i]);
			}
			
		}
	}
}


void Union(int a,int b)
{
	int rta=Findroot(a);
	int rtb=Findroot(b);
	if(rta==rtb)
	{
		e[rta].incir=true;
		e[rtb].incir=true;
	}
	e[rta].father=rtb;
	
}

int Findroot(int a)
{//cout<<"bbb"<<endl;
	int r=a;
	while(r!=e[a].father)
	{
		r=e[a].father;
	}
	int rt=r;
	r=a;
	while(r!=e[r].father)
	{
		e[r].incir=e[rt].incir;
		e[r].father=rt;
		r=e[r].father;
	}
//	cout<<a<<' '<<e[a].father<<endl;
	return e[a].father;
}