Cod sursa(job #513305)

Utilizator ChallengeMurtaza Alexandru Challenge Data 15 decembrie 2010 17:21:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <fstream>

using namespace std;

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

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

int v[MaxN],sol,N,M,st,sf,A[LogMaxN][MaxN],lg[MaxN];

int main()
{
	fin>>N>>M;
	for(register int i=1;i<=N;++i)
	{
		fin>>v[i];
		A[0][i]=v[i];
	}
	for(register int i=2;i<=N;++i)
	{
		lg[i]=lg[i>>1]+1;
	}

	int p=1;
	for(register int j=1;j<LogMaxN;++j,p<<=1)
	{
		for(register int i=1;i<=N;++i)
		{
			if(i+p<=N)
			{
				A[j][i]=min(A[j-1][i],A[j-1][i+p]);
			}
			else
			{
				A[j][i]=A[j-1][i];
			}
		}
	}

	for(register int i=1;i<=M;++i)
	{
		fin>>st>>sf;
		int len=(sf-st+1);
		sol=min(A[lg[len]][st],A[lg[len]][sf-(1<<lg[len])+1]);
		fout<<sol<<"\n";
	}
	fin.close();
	fout.close();
	return 0;
}