Cod sursa(job #217106)

Utilizator mika17Mihai Alex Ionescu mika17 Data 27 octombrie 2008 00:05:03
Problema Cerere Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <fstream>
#include <sstream>

#define NMAX 100001
#define MAX_BUF_SIZE 1300000

using namespace std;

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

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

char buf[MAX_BUF_SIZE];

void read_data()
{
        f>>N;

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

        f.read(buf,MAX_BUF_SIZE);

        int deg[NMAX],notr[NMAX];

        stringstream str (buf);

        int u,v;
        for(int i = 0; i < N - 1; ++i)
        {
         str>>u>>v;
         deg[u]++;
        }

        for(int i = 1; i <= N; ++i)
         A[i] = new int[ deg[i] ], A[i][0] = 0;

        str.seekg(0,ios::beg);

        for(int i = 0; i < N - 1; ++i)
        {
         str>>u>>v;    notr[v] = 1;
         A[u][ ++A[u][0] ] = 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 = 1; i <= A[node][0]; ++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();
}