Cod sursa(job #1672512)

Utilizator stoianmihailStoian Mihail stoianmihail Data 2 aprilie 2016 20:14:15
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include <stdio.h>

#define Nadejde 100000
#define Smerenie 16

int N, M;
int log[Nadejde + 1];
int shl[Smerenie + 1];
int rmq[Smerenie + 1][Nadejde + 1];

int MIN(int X, int Y) {
  return X < Y ? X : Y;
}

void init() {
  int i;

  for (i = 0; i <= Smerenie; i++) {
    shl[i] = (1 << i);
  }
  for (i = 1; i <= Nadejde; i++) {
    log[i] = log[i >> 1] + 1;
  }
}

int main(void) {
  int i, j, b, e;
  FILE *f = fopen("rmq.in", "r");

  /* Precalculare. */
  init();

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

  /* Programare dinamica. */
  for (j = 1; j <= Smerenie; j++) {
    for (i = 1; i + shl[j] - 1 <= N; i++) {
      rmq[j][i] = MIN(rmq[j - 1][i], rmq[j - 1][i + shl[j - 1]]);
    }
  }

  /* Raspunde la intrebari. */
  for (i = 1; i <= M; i++) {
    fscanf(f, "%d %d", &b, &e);
    j = log[b - e + 1];
    fprintf(stdout, "%d\n", MIN(rmq[j][b], rmq[j][e - shl[j] + 1]));
  }
  fclose(f);
  fclose(stdout);

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