Cod sursa(job #513268)

Utilizator ChallengeMurtaza Alexandru Challenge Data 15 decembrie 2010 16:28:02
Problema Range minimum query Scor 0
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[i][0]=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>>1)<=N)
			{
				A[i][j]=min(A[i][j-1],A[i+(p>>1)][j-1]);
			}
			else
			{
				A[i][j]=A[i][j-1];
			}
		}
	}

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