Cod sursa(job #1699619)

Utilizator stoianmihailStoian Mihail stoianmihail Data 7 mai 2016 22:32:32
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <stdio.h>

#define Nadejde 250000
#define BASE 2
#define MAX_LOG 18

int N, M;
int dad[MAX_LOG + 1][Nadejde + 1];
int shl[MAX_LOG + 1];
int level[Nadejde + 1];

int d(int u) {
  if (u == 0) {
    return 0;
  }
  if (level[u]) {
    return level[u];
  }
  level[u] = 1 + d(dad[0][u]);
  return level[u];
}

int main(void) {
  int i, j, u, x;
  FILE *f = fopen("stramosi.in", "r");

  shl[0] = 1;
  for (i = 1; i <= MAX_LOG; i++) {
    shl[i] = shl[i - 1] * BASE;
  }

  fscanf(f, "%d %d", &N, &M);
  for (u = 1; u <= N; u++) {
    fscanf(f, "%d", &dad[0][u]);
  }

  for (i = 1; i <= MAX_LOG; i++) {
    for (u = 1; u <= N; u++) {
      dad[i][u] = dad[i - 1][dad[i - 1][u]];
    }
  }

  freopen("stramosi.out", "w", stdout);
  while (M) {
    fscanf(f, "%d %d", &u, &x);
    if (x > d(u)) {
      u = 0;
    } else {
      for (i = MAX_LOG; i >= 0 && x; i--) {
        if ((1 << i) & x) {
          u = dad[i][u];
        }
      }
    }
    fprintf(stdout, "%d\n", u);
    M--;
  }
  fclose(f);
  fclose(stdout);

  /// Multumim Doamne!
  puts("Doamne ajuta!");
  return 0;
}