Cod sursa(job #1512127)

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

#define MAX_N 100000
#define BUFFSIZE 65536
#define NIL -1
#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 need[MAX_N];

int query(int u) {
  if (need[u] != NIL) {
    return need[u];
  }
  int k, v = ask[u], *p = &need[u];
  for (k = 0; (1 << k) <= v; k++) {
      if ((v >> k) & 1) {
        u = d[k][u];
      }
  }
  return *p = 1 + query(u);
}

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

  n = readInt(f);

  for (i = 0; i < n; i++) {
    ask[i] = readInt(f);
    if (!ask[i]) {
      need[i] = 0;
    } else {
      need[i] = NIL;
    }
  }
  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++) {
    fprintf(f, "%d ", query(i));
  }
  fclose(f);
  return 0;
}