Cod sursa(job #1411446)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 31 martie 2015 18:43:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>
#include <algorithm>

const int MAX_N(100005);
const int MAX_LOG(17);

int n, m;
int Dp [MAX_LOG] [MAX_N];
int Log [MAX_N];

inline void Init (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)
			Dp[i][j] = std::min(Dp[i - 1][j],Dp[i - 1][j + (1 << (i - 1))]);
}

inline int Rmq (int ql, int qr)
{
	int len(qr - ql + 1);
	return std::min(Dp[Log[len]][ql],Dp[Log[len]][qr - (1 << Log[len]) + 1]);
}

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