Cod sursa(job #1608579)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 22 februarie 2016 10:40:36
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#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;
}