#include <iostream>
#include <vector>
#define MAXN 300005
int N, Q;
int Prev[MAXN];
std::vector<int> Graph[MAXN];
std::pair<int, int> Query[MAXN];
bool Flag[MAXN];
int Ans[MAXN];
class UFS {
public:
int Tree[MAXN];
void Init() {
for (int i = 0; i < MAXN; i++)
Tree[i] = i;
}
int FindRoot(int X) {
if (Tree[X] == X) return X;
return FindRoot(Tree[X]);
}
void Union(int Node1, int Node2) {
int Root1 = FindRoot(Node1), Root2 = FindRoot(Node2);
if (Root1 == Root2) {
Tree[Root1] = Tree[Root2] = 0;
} else {
Tree[Root2] = Root1;
}
}
void Union2(int Node1, int Node2) {
int Root1 = FindRoot(Node1), Root2 = FindRoot(Node2);
Tree[Root2] = Root1;
}
} P6706_Main;
bool Visit[MAXN];
void Set(int Node1, int Root) {
Visit[Node1] = true;
P6706_Main.Union2(Root, Node1);
for (int Node2: Graph[Node1]) {
if (Flag[Node2] || Visit[Node2]) continue;
Set(Node2, Root);
}
}
int main() {
std::cin >> N;
for (int i = 1; i <= N; i++) {
std::cin >> Prev[i];
if (Prev[i]) Graph[Prev[i]].push_back(i);
}
P6706_Main.Init();
std::cin >> Q;
for (int i = 1; i <= Q; i++) {
std::cin >> Query[i].first >> Query[i].second;
if (Query[i].first == 2) {
Flag[Query[i].second] = true;
}
}
//std::cout << "" << "" << "" << "";
for (int i = 1; i <= N; i++) {
int Root = i;
if (!Visit[i]) {
while (!Flag[Root] && Prev[Root] != 0) {
Root = Prev[Root];
if (Visit[Root]) {
P6706_Main.Union(0, Root);
break;
}
Visit[Root] = true;
}
//std::cout << "" << "" << "" << "";
Set(Root, Root);
//std::cout << "" << "" << "" << "";
}
}
//std::cout << "" << "" << "" << "";
for (int i = Q; i >= 1; i--) {
if (Query[i].first == 1) {
Ans[i] = P6706_Main.FindRoot(Query[i].second);
} else {
P6706_Main.Union(Prev[Query[i].second], Query[i].second);
}
}
for (int i = 1; i <= Q; i++) {
if (Query[i].first == 1) {
if (Ans[i] != 0) std::cout << Ans[i] << '\n';
else std::cout << "CIRCUS\n";
}
}
return 0;
}
rt,谁来帮我 (不知道有没有固态硬盘)