Cod sursa(job #3365732)

Utilizator andreidumitrache1709andreidumitrache andreidumitrache1709 Data 23 septembrie 2026 12:39:50
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <bits/stdc++.h>

using namespace std;

const int MAXN = 1e5;

int dp[MAXN + 1] , k[MAXN + 1] , par[MAXN + 1];
vector< int >ancestors;
vector< int >edges[MAXN + 1];
void dfs( int nod ) {
    ancestors.push_back( nod );
    for( auto x : edges[nod] ) {
        //cout << k[x] << '\n';
        if( k[x] ) {
            dp[x] = dp[ancestors[ancestors.size() - k[x]]] + 1;
            //cout << ancestors[ancestors.size() - k[x]] << ' ' << dp[ancestors[ancestors.size() - k[x]]]  << ' ' << x << '\n';
            
        }
        dfs( x );
    }
    ancestors.pop_back();
}
int main() {
    ifstream cin( "cerere.in" );
    ofstream cout( "cerere.out" );
    int n , i , a , b;
    cin >> n;
    for( i = 1 ; i <= n ; i++ )
        cin >> k[i];
    for( i = 1 ; i < n ; i++ ) {
        cin >> a >> b;
        edges[a].push_back( b );
        par[b] = 1;
    }
    for( i = 1 ; i <= n ; i++ )
        if( !par[i] )
            dfs( i );
    for( i = 1 ; i <= n ; i++ )
        cout << dp[i] << ' ';
    cout << '\n';
    return 0;
}