0w1

CFR 689 B. Mike and Shortcuts ( Shortest Path )

Problem - B - Codeforces
Well, it's easy. But not what I had expected for pB in division 2.
And since the transition cost is constant, bfs = queue was enough, and priority_queue was kind of overkill.

void solve(){
    int N; cin >> N;
    vi A( N );
    for( int i = 0; i < N; ++i )
        cin >> A[ i ], --A[ i ];
    vi dis( N, 1e9 );
    priority_queue< pii, vector< pii >, greater< pii > > pq;
    pq.push( pii( dis[ 0 ] = 0, 0 ) );
    while( !pq.empty() ){
        int u = pq.top().second;
        int w = pq.top().first;
        pq.pop();
        if( w > dis[ u ] ) continue;
        if( u - 1 >= 0 and dis[ u - 1 ] > w + 1 )
            pq.push( pii( dis[ u - 1 ] = w + 1, u - 1 ) );
        if( u + 1 < N and dis[ u + 1 ] > w + 1 )
            pq.push( pii( dis[ u + 1 ] = w + 1, u + 1 ) );
        if( dis[ A[ u ] ] > w + 1 )
            pq.push( pii( dis[ A[ u ] ] = w + 1, A[ u ] ) );
    }
    for( int i = 0; i < N; ++i )
        cout << dis[ i ] << ( i + 1 == N ? '\n' : ' ' );
}