Cod sursa(job #1512116)

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

#define MAX_N 100000
#define BUFFSIZE 65536
#define LOG 17

char buf[BUFFSIZE];
int pos = BUFFSIZE;

inline char getChar(FILE *f) {
  if (pos == BUFFSIZE) {
    fread(buf, 1, BUFFSIZE, f);
    pos = 0;
  }
  return buf[pos++];
}

inline int readInt(FILE *f) {
  int q = 0;
  char c;

  do {
    c = getChar(f);
  } while (!isdigit(c));
  do {
    q = (10 * q) + (c - '0');
    c = getChar(f);
  } while (isdigit(c));
  return q;
}

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;

  n = readInt(f);

  for (i = 0; i < n; i++) {
    ask[i] = readInt(f);
  }
  for (i = 1; i < n; i++) {
    u = readInt(f) - 1;
    v = readInt(f) - 1;
    d[0][v] = u;
  }
  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;
}