Cod sursa(job #2476191)

Utilizator DordeDorde Matei Dorde Data 18 octombrie 2019 11:51:57
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <fstream>
#include <queue>
using namespace std;
ifstream f ("cerere.in");
ofstream g ("cerere.out");
int const NM = 1e5 + 1;
int v [NM] , vf [NM] , nxt [NM];
int k [NM] , sz , t [NM];
int dp [NM] , st [NM] , h [NM];
void add (int x , int y){
    vf [++ sz] = y;
    nxt [sz] = v [x];
    v [x] = sz;
}
int o;
void BF (int start){
    static queue <int> q;
    q . push (start);
    while (0 < q . size ()){
        int x = q . front ();
        for(int i = v [x] ; i ; i = nxt [i]){
            int j = vf [i];
            h [j] = 1 + h [x];
            q . push (j);
        }
        q . pop ();
    }
}
void DF (int node){
    while (o && h [st [o]] >= h [node])
        -- o;
    st [++ o] = node;
    for(int i = v [node] ; i ; i = nxt [i]){
        int j = vf [i];
        if (k [j])
            dp [j] = 1 + dp [st [o - k [j] + 1]];
        DF (j);
    }
    -- o;
}
int main()
{
    int n;
    f >> n;
    for(int i = 1 ; i <= n ; ++ i)
        f >> k [i];
    for(int i = 1 ; i < n ; ++ i){
        int a , b;
        f >> a >> b;
        add (a , b);
        t [b] = a;
    }
    for(int i = 1 ; i <= n ; ++ i)
        if (! t [i]){
            BF (i);
            DF (i);
        }
    for(int i = 1 ; i <= n ; ++ i)
        g << dp [i] << ' ';
    return 0;
}