Link to this code: https://cses.fi/paste/63010bd72e1b9101685af5/
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
class Solve{
int *t;
vector<bool>vis;
vector<int>dis;
public:
Solve(int *a,int n){
 vis.resize(n+1,false);
 dis.resize(n+1,0);
 t=a;
}
void floyd(int i){
 int a=i;
 int b=t[i];
 while(a!=b){
  if(vis[a])return;
  vis[a]=true;
  a=t[a];
  b=t[t[b]];
 }
 b=t[a];
 int len=1;
 while(a!=b){
  b=t[b];
  len++;
 }
 b=t[a];
 while(a!=b){
  dis[b]=len;
  b=t[b];
 }
 dis[a]=len;
}
int dusraDfs(int i){
   if(dis[i])return dis[i];
   return dis[i]=dusraDfs(t[i])+1;
}
void debug(int n){
  for(int i=1;i<=n;i++){
    cout<<dis[i]<<" ";
  }
}
};
int main(){
  int n;
  cin>>n;
  int a[n+1];
  for(int i=1;i<=n;i++){
    cin>>a[i];
  }
  Solve sol(a,n);
  for(int i=1;i<=n;i++){
      sol.floyd(i);
  }
  // sol.debug(n);
  for(int i=1;i<=n;i++){
      cout<<sol.dusraDfs(i)<<" ";
  }
  return 0;
}