Cod sursa(job #2457500)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 17 septembrie 2019 21:48:10
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("cerere.in");
ofstream g("cerere.out");

const int NMAX = 1e5 + 5;

int N, Root, T[NMAX], A[NMAX], ans[NMAX];

int Who[NMAX];

bool Sel[NMAX];

vector < int > G[NMAX];

static inline void Read ()
{
    f.tie(NULL);

    f >> N;

    for(int i = 1; i <= N; ++i)
        f >> A[i];

    for(int i = 1; i < N; ++i)
    {
        int X = 0, Y = 0;

        f >> X >> Y;

        T[Y] = X;

        G[X].push_back(Y);
    }

    return;
}

static inline void Go (int Node, int Level)
{
    Sel[Node] = true;

    if(A[Node] == 0)
        ans[Node] = 0;
    else
        ans[Node] = ans[Who[Level - A[Node]]] + 1;

    Who[Level] = Node;

    for(auto it : G[Node])
        if(!Sel[it])
            Go(it, Level + 1);

    Who[Level] = 0;
}

int main()
{
    Read();

    for(int i = 1; i <= N; ++i)
        if(!T[i])
        {
            Root = i;

            break;
        }

    Go(Root, 1);

    for(int i = 1; i <= N; ++i)
        g << ans[i] << ' ';

    g << '\n';

    return 0;
}