Cod sursa(job #217108)

Utilizator mika17Mihai Alex Ionescu mika17 Data 27 octombrie 2008 00:20:32
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <fstream>
#include <vector>

#define NMAX 100001

using namespace std;

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

int N,kth[NMAX], num[NMAX], stack[NMAX], K = -1, root;

vector<int> A[NMAX];

void read_data()
{
        f>>N;

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

        int notr[NMAX];

        for(int i = 0, u, v; i < N - 1; ++i)
        {
         f>>u>>v;
         notr[v] = 1;
         A[u].push_back(v);
        }

        for(int i = 1; i <= N; ++i)
        {
         if(!notr[i]) { root = i; break; }
        }
}

void dfs(int node)
{
        stack[++K] = node;

        if( kth[node] )
         num[node] = num[ stack[K - kth[node]] ] + 1;

        for(int i = 0; i < A[node].size(); ++i)
         dfs(A[node][i]);

        --K;
}

void write_sol()
{
        for(int i = 1; i <= N; ++i)
          g<<num[i]<<' ';
}

int main()
{
        read_data();
        dfs(root);
        write_sol();
}