import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
// 使用 BufferedReader 和 PrintWriter 提升大规模数据下的 I/O 效率
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
// 1. 读取学生总人数 n
int n = Integer.parseInt(br.readLine().trim());
// 2. 读取指认关系字符串并按空格拆分
String[] strA = br.readLine().trim().split("\\s+");
// p[i] 存储学生 i 指认的学生编号
// 使用 n+1 大小以便让下标 1~n 对应学生编号 1~n,符合直觉
int[] p = new int[n + 1];
for (int i = 1; i <= n; i++) {
p[i] = Integer.parseInt(strA[i - 1]);
}
// 3. 题目要求:假设老师最初抓到的是第 i 个学生
// 我们需要对 1 到 n 每一个起点都模拟一遍追踪过程
for (int i = 1; i <= n; i++) {
// 获取从起点 i 开始追踪,最后被老师劝退的学生编号
int res = findStu(i, p, n);
// 格式化输出:除了最后一个数,后面都加空格
out.print(res + (i == n ? "" : " "));
}
// 4. 刷新缓冲区确保数据完整写出,并按规范关闭流资源
out.flush();
out.close();
br.close();
}
/**
* 追踪退学警告的过程
*
* @param start 老师最初抓到的学生编号
* @param p 指认关系数组(图的邻接关系)
* @param n 学生总数
* @return 第一个收到两次警告(即导致退学)的学生编号
*/
private static int findStu(int start, int[] p, int n) {
// visited[i] 记录学生 i 是否已经收到过一次警告
// 每一轮新起点都需要一个全新的标记数组
boolean[] visited = new boolean[n + 1];
int cur = start; // 从老师抓到的第一位学生开始
// 由于学生数量有限且出度为 1,追踪过程必然会进入一个环并死循环
// 我们通过 while(true) 配合内部 return 退出
while (true) {
// 如果当前学生 cur 的 visited 标记已经是 true,
// 说明这是他第二次被抓到了,触发“劝说退学”逻辑,直接返回他
if (visited[cur]) {
return cur;
}
// 第一次抓到该学生,打上标记(发出第一次退学警告)
visited[cur] = true;
// 根据供述,抓取下一个被指认的人
cur = p[cur];
}
}
}