#include <bits/stdc++.h>
using namespace std;
int ans[100006];
int num[100006];
int low[100006];
int dfn[100006];
int entry[100006];
vector<int> stake;
int time2=1;
int tarjan(int number)
{
low[number]=time2;
dfn[number]=time2;
time2++;
if(!dfn[num[number]])
{
entry[num[number]]=1;
stake.push_back(num[number]);
tarjan(num[number]);
low[number]=min(low[number],low[num[number]]);
}
if(entry[number])
{
low[number]=min(low[number],low[num[number]]);
}
if(low[number]==dfn[number])
{
entry[number]=1;
if(stake[stake.size()-1]==number)
{
stake.pop_back();
}
else
{
int k;
int first=0;
int sum=stake.size();
for(int i=0;i<stake.size();i++)
{
if(stake[i]==number)
{
k=i;
break;
}
}
while(stake[stake.size()-1]!=number)
{
first=stake[stake.size()-1];
ans[first]=sum-k;
stake.pop_back();
}
first=stake[stake.size()-1];
ans[first]=sum-k;
stake.pop_back();
}
}
}
int dfs(int number)
{
if(ans[number])
{
return ans[number];
}
int count2=1;
if(ans[num[number]])
{
return count2+ans[num[number]];
}
else
{
count2+=dfs(num[number]);
}
return count2;
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>num[i];
if(num[i]==i)
{
ans[i]=1;
}
}
for(int i=1;i<=n;i++)
{
if(!ans[i]&&!dfn[i])
{
entry[i]=1;
stake.push_back(i);
tarjan(i);
}
}
for(int i=1;i<=n;i++)
{
ans[i]=dfs(i);
cout<<ans[i]<<endl;
}
}