Pagini recente » Cod sursa (job #2089193) | Cod sursa (job #1931964) | Cod sursa (job #2460765) | Cod sursa (job #980263) | Cod sursa (job #1608579)
#include<fstream>
using namespace std;
ifstream fin( "cerere.in" ); ofstream fout( "cerere.out" );
const int nmax = 1e5;
const int lgmax = 16;
int n;
int ans[ nmax + 1 ], c[ nmax + 1 ];
int d[ lgmax + 1 ][ nmax + 1 ];
void calculeaza_stramosi() {
for( int i = 1; (1 << i) <= n; ++ i ) {
for( int j = 1; j <= n; ++ j ) {
d[ i ][ j ] = d[ i - 1 ][ d[ i - 1 ][ j ] ];
}
}
}
int tata( int x, int k ) {
int sol = x;
for( int i = 0; (1 << i) <= k; ++ i ) {
if ( k & (1 << i) ) {
sol = d[ i ][ sol ];
}
}
return sol;
}
int solve( int x ) {
if ( ans[ x ] > 0 ) {
return ans[ x ];
}
if ( c[ x ] == 0 ) {
return 1;
}
return ( ans[ x ] = solve( tata( x, c[ x ] ) ) + 1 );
}
int main() {
fin >> n;
for( int i = 1; i <= n; ++ i ) {
fin >> c[ i ];
}
for( int i = 1; i <= n; ++ i ) {
int x, y;
fin >> x >> y;
d[ 0 ][ y ] = x;
}
calculeaza_stramosi();
for( int i = 1; i <= n; ++ i ) {
fout << solve( i ) - 1 << " ";
}
fout << "\n";
fin.close();
fout.close();
return 0;
}