Cod sursa(job #1744583)

Utilizator oldatlantianSerban Cercelescu oldatlantian Data 19 august 2016 23:01:05
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.91 kb
#include <bits/stdc++.h>
using namespace std;

const int NMAX = 100005;

vector<int> stk, g[NMAX];
int            ant[NMAX], k[NMAX];
bool             f[NMAX];

int n;

void dfs(int u) {
    stk.push_back(u);

    if(k[u])
    ant[u] = ant[stk[stk.size()-k[u]-1]] + 1;

    for(int v:g[u])
        dfs(v);

    stk.pop_back();
}

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

    scanf("%d",&n);

    for(int i=1; i<=n; ++i) {
        scanf("%d",&k[i]);
    }
    for(int i=1; i<n;  ++i) {
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
        f[b] = true;
    }

    for(int i=1; i<=n; ++i) {
        if(!f[i]) {
            dfs(i);
            break;
        }
    }

    for(int i=1; i<=n; ++i)
        printf("%d ",ant[i]);
    printf("\n");

    fclose(stdin);
    fclose(stdout);
    return 0;
}