Cod sursa(job #512965)

Utilizator ChallengeMurtaza Alexandru Challenge Data 14 decembrie 2010 21:07:04
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>
#include <cmath>

using namespace std;

const char InFile[]="rmq.in";
const char OutFile[]="rmq.out";
const int MaxN=100111;
const int MAX=100111;

ifstream fin(InFile);
ofstream fout(OutFile);

int v[MaxN],sol,N,M,st,sf,sqrtN,N2,v2[MaxN];

int main()
{
	fin>>N>>M;
	for(register int i=1;i<=N;++i)
	{
		fin>>v[i];
	}
	sqrtN=(int)(ceil(sqrt((double)(N))));
	N2=sqrtN*sqrtN;
	for(register int i=N+1;i<=N2;++i)
	{
		v[i]=MAX;
	}
	for(register int i=1;i<=sqrtN;++i)
	{
		v2[i]=MAX;
		for(register int j=1;j<=sqrtN;++j)
		{
			v2[i]=min(v2[i],v[++st]);
		}
	}
	for(register int i=1;i<=M;++i)
	{
		fin>>st>>sf;
		sol=MAX;
		int j=0;
		int stl,drl;
		while(j*sqrtN<st)
		{
			++j;
		}
		++j;
		stl=min(sf,sqrtN*(j-1));
		for(;sqrtN*j<=sf;++j)
		{
			sol=min(sol,v2[j]);
		}
		drl=max(st,sqrtN*(j-1));

		for(register int j=st;j<=stl;++j)
		{
			sol=min(sol,v[j]);
		}
		for(register int j=drl;j<=sf;++j)
		{
			sol=min(sol,v[j]);
		}
		fout<<sol<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}