Cod sursa(job #2438675)

Utilizator IoanaDraganescuIoana Draganescu IoanaDraganescu Data 13 iulie 2019 13:08:19
Problema Cerere Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("cerere.in");
ofstream fout("cerere.out");

const int lg = 17;

vector <int> g[100005];
int d[100005][20], nr[100005], k[100005], n;
bool tata[100005];

void read(){
    fin >> n;
    for (int i = 1; i <= n; i++)
        fin >> k[i];
    for (int i = 1; i < n; i++){
        int a, b;
        fin >> a >> b;
        g[a].push_back(b);
        d[b][0] = a;
        tata[b] = 1;
    }
}

void dfs1(int nod){
    for (auto i : g[nod]){
        for (int j = 1; j <= lg; j++)
            d[i][j] = d[d[i][j - 1]][j - 1];
        dfs1(i);
    }
}

void dfs2(int nod){
    int p = k[nod], x = nod;
    if (p > 0){
        for (int j = lg; j >= 0; j--)
            if (p & (1 << j))
                x = d[x][j];
        nr[nod] = nr[x] + 1;
    }
    for (auto i : g[nod])
        dfs2(i);
}

void solve(){
    int rad = 0;
    for (int i = 1; i <= n; i++)
        if(!tata[i])
            rad = i;
    dfs1(rad);
    dfs2(rad);
}

void print(){
    for (int i = 1; i <= n; i++)
        fout << nr[i] << ' ';
    fout << '\n';
}

int main()
{
    read();
    solve();
    print();
    return 0;
}