记录编号 |
272525 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[焦作一中2012] 玻璃球游戏 |
最终得分 |
100 |
用户昵称 |
liu_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;
}