#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define sort stable_sort
#define endl '\n'
struct node
{
int next,to;
}e[100001];
stack<int>s;
int head[100001],dfn[100001],low[100001],ins[100001],scc[100001],c[100001],u[100001],v[100001],cnt=0,tot=0,ans=0;
void add(int u,int v)
{
cnt++;
e[cnt].next=head[u];
e[cnt].to=v;
head[u]=cnt;
}
void tarjan(int x)
{
int i,k=0;
tot++;
dfn[x]=low[x]=tot;
ins[x]=1;
s.push(x);
for(i=head[x];i!=0;i=e[i].next)
{
if(dfn[e[i].to]==0)
{
tarjan(e[i].to);
low[x]=min(low[x],low[e[i].to]);
}
else
{
if(ins[e[i].to]==1)
{
low[x]=min(low[x],dfn[e[i].to]);
}
}
}
if(dfn[x]==low[x])
{
ans++;
while(x!=k)
{
k=s.top();
ins[k]=0;
c[k]=ans;
scc[ans]++;
s.pop();
}
}
}
int main()
{
int n,i,j,sum;
cin>>n;
for(i=1;i<=n;i++)
{
u[i]=i;
cin>>v[i];
add(u[i],v[i]);
}
for(i=1;i<=n;i++)
{
if(dfn[i]==0)
{
tarjan(i);
}
}
cnt=0;
memset(e,0,sizeof(e));
memset(head,0,sizeof(head));
for(i=1;i<=n;i++)
{
if(c[u[i]]!=c[v[i]])
{
add(c[u[i]],c[v[i]]);
}
}
for(i=1;i<=n;i++)
{
if(u[i]==v[i])
{
cout<<"1"<<endl;
}
else
{
if(scc[c[u[i]]]==1)
{
sum=1;
for(j=head[c[u[i]]];j!=0;j=e[j].next)
{
if(scc[c[e[j].to]]==1)
{
sum++;
}
else
{
sum+=scc[c[e[j].to]];
break;
}
}
cout<<sum<<endl;
}
else
{
cout<<scc[c[u[i]]]<<endl;
}
}
}
return 0;
}