Cod sursa(job #1604214)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 18 februarie 2016 01:40:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin("rmq.in");
ofstream fout("rmq.out");

const int NMAX = 100000;
const int MMAX = 100000;
const int H = 18;


int n; int m;

int rmq[H][NMAX + 1];//rmq[i][j] = min(v[j]...v[j + 2^i - 1]) inclusiv

int lg[NMAX + 1];//lg[i] = cel mai mare nr ai 2^lg[i] <= i

void constructRmq() {

	for(int i = 1; (1 << i) <= n; ++i) 
		for(int j = 1; j + (1 << i) - 1 <= n ; ++j) 
			rmq[i][j] = min(rmq[i - 1][j], rmq[i - 1][j + (1 << (i - 1) )]);
}

int query(int left, int right) {

	int dim = right - left + 1;
	int lgDim = lg[dim];
	return min(rmq[lgDim][left], rmq[lgDim][right - (1<<lgDim) + 1]);
}

int main() {

	fin >> n >> m;

	for(int i = 1; i <= n; ++i)
		fin >> rmq[0][i];

	constructRmq();

	lg[1] = 0;

	for(int i = 2 ; i <= n ; ++i)
		lg[i] = lg[i / 2] + 1; 

	while(m--) {

		int left; int right;
		fin >> left >> right;

		fout << query(left, right) << '\n'; 
	}

	return 0;

}