Cod sursa(job #374578)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 17 decembrie 2009 14:30:08
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
#include <fstream>
#define MaxN 200000
#define MaxL 18
using namespace std;
fstream fin ("rmq.in", ios::in);
fstream fout("rmq.out", ios::out);

int sir[MaxN];
int n, m, V[MaxN][MaxL], ex1, ex2, lg[MaxN];

void rmq(){

	for (int i = 0; i <= n; i++)
		V[i][0] = sir[i];
	
	for (int j = 1; 1 << j <= n; j++)
		for (int i = 0; i < n; i++)
			if (V[i][j - 1] < V[i + (1 << (j - 1))][j - 1])
				V[i][j] = V[i][j - 1];
			else
				V[i][j] = V[i + (1 << (j - 1))][j-1];

};



int main(){
	fin>>n>>m;

	for (int i = 1; i <= n; ++i){
		fin>>sir[i];
	};
	
	rmq();
	lg[1] = 0;
	for (int i = 2; i <= n; i++)
		lg[i] = lg[i/2] + 1;

	for (int i = 1; i <= m; ++i){
		fin>> ex1 >> ex2;
		int dif,l;
		dif = ex2 - ex1 + 1;
		l = lg[dif];
		fout << min(V[ex1][l], V[ex1 + dif - (1 << l)][l])<< '\n';
	};

	fin.close();
	fout.close();


};