CSES - Shared codeLink 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;
}