记录编号 |
235063 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[焦作一中2012] 玻璃球游戏 |
最终得分 |
100 |
用户昵称 |
洛克索耶夫 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.563 s |
提交时间 |
2016-03-10 10:25:41 |
内存使用 |
6.61 MiB |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int ans[300100]={0},to[300100]={0},root[300100]={0};
int ope1[300100]={0},ope2[300100]={0};
bool isdel[300100]={false},incircle[300100]={false};
int Read()
{
char ch=getchar();
int a=0;
while(ch<'0'||ch>'9') ch=getchar();
while(ch>='0'&&ch<='9'){
a=a*10+ch-'0';
ch=getchar();
}
return a;
}
inline int FindRoot(int a)
{
if(root[a]!=a){
root[a]=FindRoot(root[a]);
incircle[a]=incircle[root[a]];
}
return root[a];
}
inline void Union(int a, int b)
{
int ra=FindRoot(a),rb=FindRoot(b);
if(ra==rb) incircle[a]=incircle[b]=true;
else root[rb]=ra;
}
int main()
{
freopen("marbles.in","r",stdin);
freopen("marbles.out","w",stdout);
memset(isdel,false,sizeof(isdel));
memset(incircle,false,sizeof(incircle));
int N,M;
N=Read();
for(int i=1;i<=N;i++) root[i]=i;
for(int i=1;i<=N;i++) to[i]=Read();
M=Read();
for(int i=1;i<=M;i++){
ope1[i]=Read();ope2[i]=Read();
if(ope1[i]==2) isdel[ope2[i]]=true;
}
for(int i=1;i<=N;i++){
if(!isdel[i]&&to[i]!=0) Union(to[i],i);
//printf("root%d:%d\n",i,root[i]);
//printf("\n\n");
}
for(int i=M;i>=1;i--){
for(int j=M;j>=1;j--){
//printf("root%d:%d\n",ope2[j],root[ope2[j]]);
//printf("circle%d:%d\n"),ope2[j],incircle[ope2[j]];
}printf("\n\n");
if(ope1[i]==2) Union(to[ope2[i]],ope2[i]);
else{
FindRoot(ope2[i]);
if(incircle[ope2[i]]) ans[i]=-1;
else ans[i]=FindRoot(ope2[i]);
}
}
for(int i=1;i<=M;i++){
if(ans[i]==-1) printf("CIKLUS\n");
if(ans[i]>0) printf("%d\n",ans[i]);
}
return 0;
}