Cod sursa(job #1604210)

Utilizator TeodorCotetCotet Teodor TeodorCotet Data 18 februarie 2016 01:24:57
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 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];//rmq[i][j] = min(v[j]...v[j + 2^i - 1]) inclusiv

int lg[NMAX];//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 sol = 0x7fffffff;
	int dim = right - left + 1;
	int ind = lg[dim];

	for(int i = ind; i >= 0; --i) {
		if(right >= left + (1 << i) - 1) {
			sol = min(sol, rmq[i][left]);
			left += (1 << i);
		}
	}

	return sol;
}

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;

}