Cod sursa(job #1132811)

Utilizator SmarandaMaria Pandele Smaranda Data 3 martie 2014 22:18:18
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#include <vector>

using namespace std;

const long N = 100005;

long n, k [N], t [N], ans [N], radacina, st [N];

vector <long> graph [N];

void read () {
    long i, a, b;

    scanf ("%ld", &n);
    for (i = 1; i <= n; i ++) {
        scanf ("%ld", &k [i]);
        ans [i] = -1;
    }
    for (i = 1; i < n; i ++) {
        scanf ("%ld%ld", &a, &b);
        graph [a].push_back (b);
        t [b] = a;
    }
}

void dfs (long x, long level) {
    vector <long> :: iterator it;
    st [level] = x;
    ans [x] = 1 + ans [st [level - k [x]]];
    for (it = graph [x].begin (); it != graph [x].end (); ++ it)
        dfs (*it, level + 1);
}

void get_root () {
    long i;
    for (i = 1; i <= n; i ++)
        if (t [i] == 0) {
            radacina = i;
            break;
        }
}

void solve () {
    long i;

    get_root ();
    dfs (radacina, 0);
    for (i = 1; i <= n; i ++)
        printf ("%ld ", ans [i]);
    printf ("\n");
}

int main () {
    freopen ("cerere.in", "r", stdin);
    freopen ("cerere.out", "w", stdout);

    read ();
    solve ();
    return 0;
}