记录编号 |
330895 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[焦作一中2012] 玻璃球游戏 |
最终得分 |
100 |
用户昵称 |
哒哒哒哒哒! |
是否通过 |
通过 |
代码语言 |
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;
}