Cod sursa(job #2317122)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 12 ianuarie 2019 20:40:32
Problema Cerere Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>

using namespace std;

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

const int NMAX=1e5+5;

int T[NMAX];

int N, K[NMAX], Root, ans[NMAX], Level[NMAX], Last[NMAX];

vector <int> G[NMAX];

bool Sel[NMAX];

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

    f>>N;

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

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

        f>>X>>Y;

        T[Y]=X;

        G[X].push_back(Y);
    }
}

inline void DFS (int From, int To)
{
    Sel[To]=true;

    for(int i=0; i<(int)G[To].size(); ++i)
        if(!Sel[G[To][i]])
        {
            Level[G[To][i]]=Level[To]+1;

            Last[Level[G[To][i]]]=G[To][i];

            if(K[G[To][i]] != 0)
                ans[G[To][i]]=ans[Last[Level[G[To][i]]-K[G[To][i]]]]+1;

            DFS(To, G[To][i]);
        }
}

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

    DFS(-1, Root);

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

    g<<'\n';
}

int main()
{
    Read();

    Solve();

    return 0;
}