Cod sursa(job #2454508)

Utilizator FunnyStockyMihnea Andreescu FunnyStocky Data 8 septembrie 2019 19:30:52
Problema Cerere Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <iostream>
#include <cstdio>

using namespace std;

const int N = 100000 + 7;
const int K = 17;

int n, jump[N];
int anc[K][N];
int p[N];
int dp[N];

int calc(int i) {
  if (dp[i] == -1) {
    dp[i] = 1 + calc(p[i]);
  }
  return dp[i];
}

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

  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> jump[i];
  }

  for (int i = 1; i < n; i++) {
    int a, b;
    cin >> a >> b;
    anc[0][b] = a;
  }

  for (int k = 1; (1 << k) <= n; k++) {
    for (int i = 1; i <= n; i++) {
      anc[k][i] = anc[k - 1][anc[k - 1][i]];
    }
  }

  for (int i = 1; i <= n; i++) {
    dp[i] = -1;
    if (jump[i] == 0) {
      dp[i] = 0;
    }
    p[i] = i;
    for (int bit = 0; (1 << bit) <= jump[i]; bit++) {
      if (jump[i] & (1 << bit)) {
        p[i] = anc[bit][p[i]];
      }
    }
  }

  for (int i = 1; i <= n; i++) {
    cout << calc(i) << ' ';
  }
  cout << '\n';




  return 0;
}