Cod sursa(job #168792)

Utilizator vlad.maneaVlad Manea vlad.manea Data 31 martie 2008 19:39:37
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
using namespace std;
#include <cstdio>
#include <vector>
#define nmax 100005

vector<int> L[nmax];

int S[nmax], A[nmax], G[nmax], K[nmax];

int N;

void parcour (int node, int tata)
{
  vector<int>::iterator it;

  S[++S[0]] = node;

  if (K[node] == 0)
    A[node] = 0;
  else
    A[node] = 1+A[S[S[0] - K[node]]];

  for (it = L[node].begin(); it != L[node].end(); ++it)
    if (*it != tata)
      parcour(*it, node);

  S[0]--;
}

int main()
{
  int i, x, y;

  freopen("cerere.in", "r", stdin);
  freopen("cerere.out", "w", stdout);

  scanf("%d", &N);

  for (i = 0; i < N; ++i)
  {
    scanf("%d", &x);
    K[i] = x;
  }

  for (i = 1; i < N; ++i)
  {
    scanf("%d%d", &x, &y);
    x--, y--;
    L[x].push_back(y);
    L[y].push_back(x);
    G[y]++;
  }

  for (i = 0; i < N && G[i]; ++i);

  parcour(i, -1);

  for (i = 0; i < N; ++i)
    printf("%d ", A[i]);

  return 0;
}