Cod sursa(job #1512110)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 27 octombrie 2015 18:30:27
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.81 kb
#include <stdio.h>

#define MAX_N 100000
#define LOG 17

int ask[MAX_N];
int d[LOG][MAX_N];

int main(void) {
  FILE *f = fopen("cerere.in", "r");
  int n, i, u, v, k, q;

  fscanf(f, "%d", &n);

  for (i = 0; i < n; i++) {
    fscanf(f, "%d", &ask[i]);
  }
  for (i = 1; i < n; i++) {
    fscanf(f, "%d%d", &u, &v);
    d[0][v - 1] = u - 1;
  }
  fclose(f);

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

  f = fopen("cerere.out", "w");
  for (i = 0; i < n; i++) {
    u = i;
    q = 0;
    while (ask[u] != 0) {
      v = ask[u];
      for (k = 0; (1 << k) <= v; k++) {
        if ((v >> k) & 1) {
          u = d[k][u];
        }
      }
      q++;
    }
    fprintf(f, "%d ", q);
  }
  fclose(f);
  return 0;
}