Cod sursa(job #3254555)

Utilizator ultra980Alex Stan ultra980 Data 7 noiembrie 2024 20:26:12
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <stdio.h>
#include <cmath>
#include <limits>

const int NMAX = 100000, LOGMAX = 17;
int rmq[LOGMAX][NMAX];

int min(int a, int b) {
  return a < b ? a : b;
}

int main() {
  FILE *fin, *fout;
  int n, m, i, l, ln, r, ohio;

  fin = fopen("rmq.in", "r");
  fscanf(fin, "%d%d", &n, &m);
  for (i = 0; i < n; i++)  {
    fscanf(fin, "%d", &rmq[0][i]);
  }
  for (l = 1; (1 << l) <= n; l++) {
    for (i = 0; i + (1 << l) - 1 < n; i++) {
      rmq[l][i] = min(rmq[l - 1][i], rmq[l - 1][i + (1 << (l - 1))]);
    }
    ohio = rmq[l][i - 1];
    for (; i < n; i++) {
//      rmq[l][i] = std::numeric_limits<int>::max();
      rmq[l][i] = ohio;
    }
  }
/*
  for (l = 0; (1 << l) <= n; l++) {
    for (i = 0; i < n; i++) {
      printf("%d ", rmq[l][i]);
    }    
    fputc('\n', stdout);
  }
*/
  fout = fopen("rmq.out", "w");
  for (i = 0; i < m; i++) {
    fscanf(fin, "%d%d", &l, &r);
    l--;
    r--;
    ohio = (int)log2(r - l + 1);
    fprintf(fout, "%d\n", min(rmq[ohio][l], rmq[ohio][r - (1 << ohio) + 1]));
  }
  fclose(fin);
  fclose(fout);

  return 0;
}