Cod sursa(job #2016396)

Utilizator mouse_wirelessMouse Wireless mouse_wireless Data 29 august 2017 12:04:46
Problema Cerere Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <cstdio>
#include <cmath>
#include <vector>
#include <algorithm>
#include <cassert>
#include <cstring>
#include <climits>
#include <queue>
using namespace std;
typedef long long LL;

#ifdef INFOARENA
#define ProblemName "cerere"
#endif

#define MCONCAT(A, B) A B
#ifdef ProblemName
#define InFile MCONCAT(ProblemName, ".in")
#define OuFile MCONCAT(ProblemName, ".out")
#else
#define InFile "fis.in"
#define OuFile "fis.out"
#endif

const int MAXN = 100010;
int ans[MAXN], K[MAXN], N;
vector<int> G[MAXN];
bool hasP[MAXN];
vector<int> v;

void DFS(int x, int lvl = 0) {
  v.push_back(x);
  ans[x] = (K[x] == 0) ? 0 : (ans[v[lvl - K[x]]] + 1);
  for (const auto &it : G[x])
    DFS(it, lvl + 1);
  v.pop_back();
}

int main() {
  assert(freopen(InFile, "r", stdin));
  assert(freopen(OuFile, "w", stdout));
  scanf("%d", &N);
  for (int i = 0; i < N; ++i)
    scanf("%d", &K[i]);
  for (int i = 0; i < N - 1; ++i) {
    int a, b;
    scanf("%d%d", &a, &b);
    --a, --b;
    G[a].push_back(b);
    hasP[b] = true;
  }
  int root = 0;
  for (; hasP[root]; ++root);
  DFS(root);
  for (int i = 0; i < N; ++i)
    printf("%d ", ans[i]);
  putchar('\n');
  return 0;
}