Cod sursa(job #523375)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 17 ianuarie 2011 21:49:14
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>
#include <iostream>
#include <string.h>

using namespace std;

const int NMAX = 100001;
const int LGMAX = 17;
int mat[LGMAX][NMAX];

int main() {
  freopen("rmq.in","r",stdin);
  freopen("rmq.out","w",stdout);
  int n, m;
  scanf("%d %d", &n, &m);
  for (int i=0; i<n; i++) scanf("%d", &mat[0][i]);
  for (int i=1, p2=1; i<LGMAX; i++, p2*=2) {
	  for (int j=0; j<n; j++)
		  if (j + p2 < n) mat[i][j] = min(mat[i-1][j], mat[i-1][j+p2]);
		  else mat[i][j] = mat[i-1][j];
  }
  for (int i=0; i<m; i++) {
	  int left, right = 0;
	  scanf("%d %d", &left, &right);
	  left--; right--;
	  int rez = -1;
	  if (left == right)
		  rez = mat[0][left];
	  else {
		int dist = right - left + 1;
		int logg = ceil(log((double)dist)/log(2.0)) - 1;
		rez = min(mat[logg][left], mat[logg][right-(1<<logg)+1]);
	  }
	  /*
	  int rezz = mat[0][left];
	  for (int j=left+1; j<=right; j++) {
		  rezz = min(rezz, mat[0][j]);
	  }
	  */
	  printf("%d\n", rez);
  }
  return 0;
}