Cod sursa(job #2953786)

Utilizator Theodor17Pirnog Theodor Ioan Theodor17 Data 12 decembrie 2022 09:38:59
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.44 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

ifstream cin("cerere.in");
ofstream cout("cerere.out");

const int NMAX = 1e5;

vector <int> g[NMAX + 1], fii[NMAX + 1];
bitset <NMAX + 1> viz;
int lift[21][NMAX + 1], dp[NMAX + 1], t[NMAX + 1], k[NMAX + 1], stramos[NMAX + 1], n;

void build(){

    for(int i = 1; (1 << i) <= n; i++)
        for(int j = 1; j <= n; j++)
            lift[i][j] = lift[i - 1][lift[i - 1][j]];

}

void solve(int x, int rad){

    int nr = k[x], p = 0, nod = x;


    while(nr){

        if((nr & 1))
            nod = lift[p][nod];

        nr >>= 1;
        p++;

    }

    stramos[x] = nod;

    //cout << "stramosul de ordin " << k[x] << " al lui " << x << " este " << stramos[x] << "\n";

    dp[x] = 1 + dp[stramos[x]];

}

void dfs(int x, int rad){

    solve(x, rad);

    for(auto y : fii[x]){


        dfs(y, rad);

    }

}

int main(){

    cin >> n;

    for(int i = 1; i <= n; i++)
        cin >> k[i];

    int x = 0, y = 0;
    for(int i = 0; i < n - 1; i++){

        cin >> x >> y;
        t[y] = x;

        fii[x].push_back(y);


    }

    int rad = 0;
    for(int i = 1; i <= n; i++)
        if(t[i] == 0)
            rad = i;

    for(int i = 1; i <= n; i++)
        lift[0][i] = t[i];

    build();
    dfs(rad, rad);

    for(int i = 1; i <= n; i++)
        cout << --dp[i] << " ";

    return 0;
}