Cod sursa(job #1946841)

Utilizator stoianmihailStoian Mihail stoianmihail Data 30 martie 2017 15:35:15
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.79 kb
#include <stdio.h>
#include <map>

using std::map;

#define MAX_N 250000
#define MAX_LOG 18

int N, M;
map <int, int> lg;
int rmq[MAX_N + 1][MAX_LOG + 1];

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

  int i, u, p;
  lg[1] = 0;
  for (i = 1; i <= MAX_LOG; i++) {
    lg[1 << i] = i;
  }

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

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

  freopen("stramosi.out", "w", stdout);
  while (M) {
    fscanf(f, "%d %d", &u, &p);
    while (p) {
      u = rmq[u][lg[p & -p]];
      p &= p - 1;
    }
    fprintf(stdout, "%d\n", u);
    M--;
  }
  fclose(f);
  fclose(stdout);
  return 0;
}