Cod sursa(job #2197821)

Utilizator MiricaMateiMirica Matei MiricaMatei Data 22 aprilie 2018 22:11:02
Problema Cerere Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <cstdio>
#include <vector>

using namespace std;

vector<int>G[100005];
int k[100005];
bool r[100005];
int ans[100005];
int st[100005];

void dfs(int node, int lvl) {
  st[lvl] = node;
  if (k[node] != 0)
    ans[node] = 1 + ans[st[lvl - k[node]]];
  for (auto it:G[node])
    dfs(it, lvl + 1);
}

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

  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i)
    scanf("%d", &k[i]);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    G[u].push_back(v);
    r[v] = 1;
  }
  int root = 0;
  for (int i = 1; i <= n && !root; ++i)
    if (!r[i])
      root = i;
  dfs(root, 1);

  for (int i = 1; i <= n; ++i)
    printf("%d ", ans[i]);

  return 0;
}