Cod sursa(job #3365676)

Utilizator Iustin_Mircea2010Iustin Mircea Iustin_Mircea2010 Data 23 septembrie 2026 09:58:36
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.94 kb
#include <bits/stdc++.h>

using namespace std;

int lift[18][100005], ans[100005], pas[100005];

vector<int> adj[100005];

void dfs(int i){
    int nod = i;
    for(int b = 17; b >= 0; b--){
        if(pas[i] & (1 << b)) nod = lift[b][nod];
    }
    if(pas[i])
        ans[i] = ans[nod] + 1;
    for(int j : adj[i])
        dfs(j);
}

int main(){
    
    ifstream cin("cerere.in");
    ofstream cout("cerere.out");
    
    int n;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> pas[i];
    }
    int root = 0;
    for(int i = 1; i < n; i++){
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        lift[0][v] = u;
    }
    for(int i = 1; i <= n; i++){
        if(lift[0][i] == 0) root = i;
    }
    for(int b = 1; 1 << b < n; b++){
        for(int i = 1; i <= n; i++){
            lift[b][i] = lift[b - 1][lift[b - 1][i]];
        }
    }
    dfs(root);
    for(int i = 1; i <= n; i++) cout << ans[i] << ' ';
    return 0;
}