Cod sursa(job #1426074)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 28 aprilie 2015 22:02:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>

#define MAX_N 100000
#define MAX_LOG 16

#define min(a, b) ((a) < (b) ? (a) : (b))

int d[MAX_LOG + 1][MAX_N]; // d[i][j] = cel mai mic element al secventei
                           // care incepe de pe pozitia j si are lungime 2^i

inline int log2(int x) {
  int ans;
  asm ("bsr %1, %0" : "=r" (ans) : "r" (x));
  return ans;
}
int main(void) {
  FILE *f, *g;
  int n, nTests;
  int width;

  f = fopen("rmq.in", "r");
  fscanf(f, "%d%d", &n, &nTests);
  for (register int i = 0; i < n; i++) {
    fscanf(f, "%d", &d[0][i]);
  }
  width = log2(n);
  for (register int i = 1; i <= width; i++) {
    register int len = n - (1 << i);
    for (register int j = 0; j <= len; j++) {
      d[i][j] = min(d[i - 1][j], d[i - 1][j + (1 << (i - 1))]);
    }
  }
  g = fopen("rmq.out", "w");
  for (; nTests; nTests--) {
    int lo, hi;
    fscanf(f, "%d%d", &lo, &hi);
    width = log2(hi - lo + 1);
    fprintf(g, "%d\n", min(d[width][lo - 1], d[width][hi - (1 << width)]));
  }
  fclose(f);
  fclose(g);
  return 0;
}