Cod sursa(job #629890)

Utilizator ELHoriaHoria Cretescu ELHoria Data 4 noiembrie 2011 09:31:05
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
#include <fstream>

using namespace std;

const int NMAX = 100002 , LMAX = 19;
long int rmq[LMAX][NMAX] , lg[NMAX] , v[NMAX] , N , M;

static inline int min(int a,int b)
{
	return a < b ? a : b;
}

int main()
{
	ifstream fin("rmq.in");
	ofstream fout("rmq.out");
	fin>>N>>M;
	lg[1] = 0;
	for(int i=1;i<=N;++i)
	fin>>v[i] , rmq[0][i] = v[i] , lg[i+1] = lg[(i+1)/2] + 1;
	lg[N+1] = 0;
	for(int i=1;(1<<i)<=N;++i)
		for(int j=1;j<=N-(1<<i)+1;j++)
			rmq[i][j] = min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);

	for(long int diff,x,y,l,sh;M;M--)
	{
		fin>>x>>y;
		l = lg[diff = y - x + 1];
		sh = diff - (1<<l);
		fout<<min(rmq[l][x],rmq[l][x + sh])<<'\n';
	}
	return 0;
}