Cod sursa(job #2157882)

Utilizator Constantin.Dragancea Constantin Constantin. Data 9 martie 2018 23:22:27
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#pragma GCC optimize("03")
#include <bits/stdc++.h>
using namespace std;

int p;
#define dim 10000
char buff[dim];

void read(int &nr){
    nr = 0;
    while (buff[p] < '0' || buff[p] > '9'){
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    }
    while (buff[p] >='0' && buff[p] <='9'){
        nr = nr*10 + buff[p] - '0';
        if (++p == dim) fread(buff, 1, dim, stdin), p = 0;
    }
}

int n, a[100010], rad = 1, pr[100010], ans[100010], h[100010], pos;
vector <int> v[100010];

void dfs(int q){
    if (a[q]) ans[q] = 1 + ans[h[pos - a[q]]];
    for (auto it: v[q]){
        h[++pos] = it, dfs(it), pos--;
    }
}

int main(){
    freopen("cerere.in","r",stdin);
    freopen("cerere.out","w",stdout);
    read(n);
    for (int i=1; i<=n; i++) read(a[i]);
    for (int i=1; i<n; i++){
        int a, b;
        read(a); read(b);
        pr[b] = a;
        v[a].push_back(b);
    }
    while (pr[rad]) rad = pr[rad];
    h[1] = rad;
    dfs(rad);
    for (int i=1; i<=n; i++) cout << ans[i] << " ";
    return 0;
}