Cod sursa(job #780531)

Utilizator visanrVisan Radu visanr Data 20 august 2012 18:11:26
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <fstream>
using namespace std;

#define nmax 100010
#define bmax 7000010

int sol[nmax], used[nmax], K[nmax], stack[nmax], A, B, N, indB;
vector<int> G[nmax];
char buff[bmax];


void DFS(int node, int pos)
{
     if(K[node] == 0) sol[node] = 0;
     else sol[node] = 1 + sol[ stack[pos - K[node]] ];
     stack[pos] = node;
     for(vector<int> :: iterator it = G[node].begin(); it != G[node].end(); ++it)
                     DFS(*it, pos + 1);
}

int Get()
{
    int nr = 0;
    while(!(buff[indB] >= '0' && buff[indB] <= '9'))
                       indB ++;
    while(buff[indB] >= '0' && buff[indB] <= '9') 
                     nr = nr * 10 + buff[indB] - '0',
                     indB ++;
    return nr;
}

int main()
{
    freopen("cerere.in", "r", stdin);
    freopen("cerere.out", "w", stdout);
    int i;
    fread(buff, 1, bmax, stdin);
    N = Get();
    for(i = 1; i <= N; i++) K[i] = Get();
    int Q = N * (N + 1) / 2;
    for(i = 1; i < N; i++)
    {
          A = Get();
          B = Get();
          G[A].push_back(B);
          Q -= B;
    }
    DFS(Q, 1);
    for(i = 1; i <= N; i++) printf("%i ", sol[i]);
    return 0;
}