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' : ' ' ); }