Cod sursa(job #1127084)

Utilizator Theorytheo .c Theory Data 27 februarie 2014 11:05:47
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

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

const int NMAX = 100009;

int N; int T[NMAX]; int K[NMAX]; bool fath[NMAX];

vector<int> G[NMAX];

int S[NMAX];


void dfs(int nod) {

    fath[nod] = true;
    S[++S[0]] = nod;

    for(unsigned i = 0 ;i < G[nod].size(); ++i)
        if(fath[G[nod][i]] == false)
            dfs(G[nod][i]);
    if(S[0] < K[nod]) T[nod] = 0;
    else T[nod] = S[S[0] - K[nod]];
    S[--S[0]];

}

int main() {

    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);
        fath[b] = true;
    }

    for(int i = 1; i <= N; ++i)
        if(fath[i] == false) G[0].push_back(i);
    memset(fath, false, sizeof(fath));

    dfs(0);

    for(int i = 1; i <= N; ++i){
        int A = i; int cnt = 0;
        while(K[A]) A = T[A], cnt++;

        fout << cnt <<" ";
    }
    return 0;
}