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];
        }
    }

}