记录编号 590981 评测结果 AAAAAAAAAA
题目名称 [焦作一中2012] 玻璃球游戏 最终得分 100
用户昵称 Gravatarliuyiche 是否通过 通过
代码语言 C++ 运行时间 0.787 s
提交时间 2024-07-14 23:34:33 内存使用 8.42 MiB
显示代码纯文本
#include <bits/stdc++.h>

using namespace std;

int n, q;
int fa[300010];
bool vis[300010];
int d[300010];
bool pd[300010];
int ans[300010];

struct qus
{
    int op;
    int x;
};
qus v[300010];

inline int get(int step)
{
	if(fa[step] == -1)
        return -1;
    if(vis[step] == 1)
        return fa[step] = -1;
    if (fa[step] == step)
		return step;
    vis[step] = 1;
	fa[step] = get(fa[step]);
	vis[step] = 0;
	return fa[step];
}

inline void merge(int x, int y)
{
	int xroot = get(x);
	vis[x] = 1;
    fa[xroot] = get(y);
    vis[x] = 0;
}

int main()
{
    freopen("marbles.in", "r", stdin);
    freopen("marbles.out", "w", stdout);

    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    cin >> n;
    for(int i = 1; i <= n; ++i)
        fa[i] = i;
    for(int i = 1; i <= n; ++i)
        cin >> d[i];
    cin >> q;
    for(int i = 1; i <= q; ++i)
    {
        cin >> v[i].op >> v[i].x;
        if(v[i].op == 2) pd[v[i].x] = 1;
    }
    for(int i = 1; i <= n; ++i)
        if(d[i] != 0 && pd[i] == 0)
            merge(i,d[i]);
    for(int i = q; i > 0; --i)
    {
        if(v[i].op == 1)
            ans[i] = get(v[i].x);
        else
            if(d[v[i].x] != 0)
                merge(v[i].x,d[v[i].x]);
    }
    for(int i = 1; i <= q; ++i)
        if(v[i].op == 1)
        {
            if(ans[i] == -1)
                cout << "CIKLUS" << '\n';
            else cout << ans[i] << '\n';
        }

   	return 0;
}