Cod sursa(job #523407)

Utilizator andreitheo87Teodorescu Andrei-Marius andreitheo87 Data 17 ianuarie 2011 22:22:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <fstream>
#include <iostream>
#include <string.h>
#include <math.h>
#include <vector>

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];
  }
  vector<int> lg2(n + 1);
  lg2[1] = 0;
  for (int i=2; i<=n; i++)
	  lg2[i] = lg2[i>>1] + 1;

  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 = lg2[dist];
		int 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 ", rezz);*/
	  printf("%d\n", rez);
  }
  return 0;
}