Cod sursa(job #993818)

Utilizator vlad96Vlad Zuga vlad96 Data 4 septembrie 2013 15:21:15
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.96 kb
#include <fstream>
#include <vector>

using namespace std;

const int MAX = 100002;

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

int n, top;
int k[MAX], sol[MAX], s[MAX];
vector <int> v[MAX];
bool b[MAX];

inline void dfs( int x )
{
    s[++top] = x;
    if ( k[x] )
        sol[x] = sol[ s[ top - k[x] ] ] + 1;
    for (size_t i = 0; i < v[x].size(); ++ i )
        dfs(v[x][i]);
    --top;
}

inline void read ()
{
    f >> n;
    for ( int i = 1; i <= n; i ++ )
        f >> k[i];
    for ( int i = 1, x, y; i <= n-1; i ++ )
    {
        f >> x >> y;
        v[x].push_back(y);
        b[y] = 1;
    }
}

inline void solve ()
{
    for(int i = 1; i <= n; ++i)
        if(!b[i])
            dfs(i), i = n;
}

inline void write ()
{
    for(int i = 1; i <= n; ++i)
        g << sol[i] << " ";
    g << "\n";
}

int main()
{
    read();
    solve();
    write();

    f.close();
    g.close();

    return 0;
}