Cod sursa(job #579663)

Utilizator mottyMatei-Dan Epure motty Data 12 aprilie 2011 12:48:27
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.77 kb
#include <fstream>

using namespace std;

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

const int N = 100001;
const int logN = 20;

int n, m;
int v[logN][N];

void BuildAnswers()
{
	for (int i = 1; (1<<i) <= n; ++i)
	{
		int pow = (1<<(i - 1));

		for (int j = 1; j <= (n - pow*2 + 1); ++j)
			v[i][j] = min(v[i - 1][j], v[i - 1][j + pow]);
	}
}

inline int GetMaxPow(int len)
{
	int pow = 0;

	while ((1<<(pow + 1)) <= len)
		pow++;

	return pow;
}

void GetAnswers()
{
	while (m--)
	{
		int a, b;
		in >> a >> b;

		int pow = GetMaxPow(b - a);

		out << min(v[pow][a], v[pow][b - (1<<pow) + 1]) << "\n";
	}
}

int main()
{
	in >> n >> m;
	for (int i = 1; i <= n; ++i)
		in >> v[0][i];

	BuildAnswers();
	GetAnswers();
	return 0;
}