链接:http://codeforces.com/problemset/problem/689/B
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+10;
const int inf=(1<<30);
vector<int>ve[maxn];
int n;
//fuck
int head[maxn],dist[maxn],vis[maxn];
struct Node
{
int v,len,pre;
}edge[3*maxn];
void init()
{
for(int i=0;i<=n;i++)
{
head[i]=-1;
dist[i]=inf;
vis[i]=0;
}
}
void add(int u,int v,int len,int index)
{
edge[index].v=v;
edge[index].len=len;
edge[index].pre=head[u];
head[u]=index;
}
void spfa(int v)
{
queue <int> q;
dist[v]=0;
vis[v]=1;
while(!q.empty())
q.pop();
q.push(v);
while(!q.empty())
{
int top=q.front();
q.pop();
vis[top]=0;
for(int i=head[top];i!=-1;i=edge[i].pre)
{
int e=edge[i].v;
if(dist[e]>dist[top]+edge[i].len)
{
dist[e]=dist[top]+edge[i].len;
if(!vis[e])
{
q.push(e);
vis[e]=1;
}
}
}
}
}
int main()
{
while(~scanf("%d",&n))
{
init();
int cnt=1;
for(int i=1;i<n;i++)
{
add(i,i+1,1,cnt++);
add(i+1,i,1,cnt++);
}
int val;
for(int i=1;i<=n;i++)
{
scanf("%d",&val);
if(i==val)continue;
add(i,val,1,cnt++);
}
spfa(1);
for(int i=1;i<=n;i++)
printf("%d ",dist[i]);
printf("\n");
}
return 0;
}