Cod sursa(job #1794019)

Utilizator TincaMateiTinca Matei TincaMatei Data 31 octombrie 2016 20:10:13
Problema Cerere Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <cstdio>

const int MAX_N = 100000;
const int MAX_LOG = 18;
int up[1+MAX_N];
int d[1+MAX_LOG][1+MAX_N];
int dist[1+MAX_N];

int stramos(int nod, int level) {
  for(int i = 0; i < MAX_LOG; ++i)
    if((1 << i) & level)
      nod = d[i][nod];
  return nod;
}

int calcDist(int nod) {
  //printf("%d->%d;", nod, up[nod]);
  if(dist[nod] == -1) {
    if(up[nod] == 0)
      dist[nod] = 0;
    else
      dist[nod] = calcDist(up[nod]) + 1;
  }
  return dist[nod];
}

int main() {
  int n, a, b;
  FILE *fin = fopen("cerere.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 1; i <= n; ++i)
    fscanf(fin, "%d", &up[i]);
  for(int i = 0; i < n - 1; ++i) {
    fscanf(fin, "%d%d", &a, &b);
    d[0][b] = a;
  }
  fclose(fin);
  for(int i = 1; i <= MAX_LOG; ++i)
    for(int j = 1; j <= n; ++j)
      d[i][j] = d[i - 1][d[i - 1][j]];

  for(int i = 1; i <= n; ++i) {
    if(up[i] > 0)
      up[i] = stramos(i, up[i]);
    dist[i] = -1;
  }

  FILE *fout = fopen("cerere.out", "w");

  for(int i = 1; i <= n; ++i)
    fprintf(fout, "%d ", calcDist(i));
  fclose(fout);
  return 0;
}