1 #include <iostream>
2 using namespace std;
3
4 int n;
5 int nextval[100010];
6 int sum[100010];
7 int circle[100010];
8 int mark;
9 bool vis[100010];
10
11 int dfs(int node, int cnt)
12 {
13 if (circle[node] != 0) return cnt - 1 + circle[node];
14 if (vis[node] == true)
15 {
16 circle[node] = cnt - sum[node];
17 mark = node;
18 return cnt - 1;
19 }
20 vis[node] = true;
21 sum[node] = cnt;
22 int ans;
23 ans = dfs(nextval[node], cnt + 1);
24 if (mark)
25 {
26 if (node == mark) mark = 0;
27 else circle[node] = circle[mark];
28 }
29 else circle[node] = circle[nextval[node]] + 1;
30 vis[node] = false;
31 return ans;
32 }
33
34 int main()
35 {
36 cin >> n;
37 for (int i = 1; i <= n; i++)
38 cin >> nextval[i];
39 for (int i = 1; i <= n; i++)
40 cout << dfs(i, 1) << endl;
41 }