Cod sursa(job #2786441)

Utilizator UnknownPercentageBuca Mihnea-Vicentiu UnknownPercentage Data 20 octombrie 2021 22:30:12
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
 
using namespace std;
 
const int Lim = 1000001;
int u = Lim - 1;
char S[Lim];

void Next() {
    if(++u == Lim)
        (void)!std::fread(S, 1, Lim, stdin), u = 0;
}

void Get(int &x) {
    for(;S[u] < '0' || S[u] > '9'; Next());
    for(x = 0;S[u] >= '0' && S[u] <= '9'; Next())
    x = x * 10 + S[u] - '0';
}

void Put(int x) {
    if(x <= 9) putchar_unlocked((char)(x + '0'));
    else {
        Put(x / 10);
        putchar_unlocked((char)(x % 10 + '0'));
    }
}

inline void Open(const string Name) {
    #ifndef ONLINE_JUDGE
        (void)!freopen((Name + ".in").c_str(), "r", stdin);
        (void)!freopen((Name + ".out").c_str(), "w", stdout);
    #endif
}

vector <int> Gr[100001];

int a[100001], ans[100001], dad[100001];
int N, root = 1;

void dfs(int v, int lvl = 0) {
    dad[lvl] = v;
    ans[v] = ans[dad[lvl - a[v]]] + 1;
    for(int to : Gr[v])
        dfs(to, lvl + 1);
}
 
int main(){

    Open("cerere");

    Get(N);
    for(int i = 1;i <= N;i++)
        Get(a[i]);

    for(int i = 1;i < N;i++) {
        int a, b;
        Get(a), Get(b);
        Gr[a].emplace_back(b);
        dad[b] = a;
    }

    for(;dad[root] != 0;root++);
    dfs(root);
    
    for(int i = 1;i <= N;i++)
        Put(ans[i] - 1), putchar_unlocked(' ');
 
}