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 }