Cod sursa(job #1380076)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 6 martie 2015 21:40:28
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb

#include <fstream>
#include <algorithm>

const int MAX_N(100001);
const int MAXLOG(18);

int Rmq [MAXLOG] [MAX_N];
int Log [MAX_N];
int n;

inline void Build (void)
{
	for (int i(2) ; i <= n ; ++i)
		Log[i] = Log[i / 2] + 1;
	for (int i(1) ; i <= Log[n] ; ++i)
		for (int j(1) ; j <= n - (1 << i) + 1 ; ++j)
			Rmq[i][j] = std::min(Rmq[i - 1][j],Rmq[i - 1][j + (1 << (i - 1))]);
}

inline int Query (int l, int r)
{
	int length(r - l + 1);
	return std::min(Rmq[Log[length]][l],Rmq[Log[length]][r - (1 << Log[length]) + 1]);
}

int main (void)
{
	std::ifstream input("rmq.in");
	int m;
	input >> n >> m;
	for (int i(1) ; i <= n ; ++i)
		input >> Rmq[0][i];
	Build();
	std::ofstream output("rmq.out");
	int x, y;
	while (m)
	{
		input >> x >> y;
		output << Query(x,y) << '\n';
		--m;
	}
	input.close();
	output.close();
	return 0;
}