记录编号 589910 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatar彭欣越 是否通过 通过
代码语言 C++ 运行时间 3.550 s
提交时间 2024-07-08 17:00:19 内存使用 7.56 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int n,q,a[300010],b[300010],f[300010],cnt,t[300010];
struct node {
    int a,b;
}c[300010];
int find (int x) {
    if (f[x]==x) return x;
    return f[x]=find(f[x]); 
}
int main () {
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    cin >> n;
    for (int i=1;i<=n;i++) {
        cin >> a[i];
        b[i]=a[i];
    }
    for (int i=1;i<=n;i++) f[i]=i;
    cin >> q;
    for (int i=1;i<=q;i++) {
        cin >> c[i].a >> c[i].b;
        if (c[i].a==2) b[c[i].b]=0; 
    }
    for (int i=1;i<=n;i++) {
        if (b[i]==0) continue;
        if (find(i)==find(b[i])) {
            f[find(b[i])]=0;
        }
        f[find(i)]=find(b[i]);
    }
    while (q) {
        //cout << q <<endl;
        int fx=find(c[q].b),fy=find(a[c[q].b]);
        //cout << fx <<' '<< c[q].b <<endl;
        if (c[q].a==1) {
            if (fx==0) t[++cnt]=-1;
            else t[++cnt]=fx;
        }else{
            if (fx==fy) {
                //cout << fx <<' '<< fy <<' '<< find(2) <<endl;
                f[fy]=0;
            }
            f[fx]=f[fy];
            //cout << f[fx] <<' '<< f[fy] <<endl; 
            //cout << find(fx) <<endl;
        }
        q--;
    }
    for (int i=cnt;i>=1;i--) {
        if (t[i]==-1) cout << "CIKLUS" <<endl;
        else cout << t[i] <<endl;
    }
    return 0;
}