Cod sursa(job #597279)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 21 iunie 2011 17:00:44
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");

int N, M, RMQ[20][100000], X[100000], Log2[100000];

inline int Min (int a, int b)
{
	if (a<b)
	{
		return a;
	}
	return b;
}

void BuildRMQ ()
{
	int i, j, n;
	for (i=2; i<=N; ++i)
	{
		Log2[i]=Log2[i/2]+1;
	}
	for (i=1; i<=N; ++i)
	{
		RMQ[0][i]=X[i];
	}
	for (i=1; i<=Log2[N]; ++i)
	{
		n=N-(1<<i)+1;
		for (j=1; j<=n; ++j)
		{
			RMQ[i][j]=Min (RMQ[i-1][j], RMQ[i-1][j+(1<<(i-1))]);
		}
	}
}

int Query (int A, int B)
{
	int L, Dif;
	L=B-A+1;
	Dif=L-(1<<Log2[L]);
	return Min (RMQ[Log2[L]][A], RMQ[Log2[L]][A+Dif]);
}

int main ()
{
	int i, A, B;
	fin >> N >> M;
	for (i=1; i<=N; ++i)
	{
		fin >> X[i];
	}
	BuildRMQ ();
	for (; M>0; --M)
	{
		fin >> A >> B;
		fout << Query (A, B) << "\n";
	}
	fin.close ();
	fout.close ();
	return 0;
}