Cod sursa(job #1323150)

Utilizator taigi100Cazacu Robert taigi100 Data 20 ianuarie 2015 19:06:20
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
/*
	Keep It Simple!
*/

#include <fstream>

#define minV(a,b) ((a)<(b)?(a):(b))

using namespace std;

const int kMax_N = 100005;

int n, q;
int value[kMax_N], lg[kMax_N], rmq[kMax_N][30];

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

void ComputeLg()
{
	lg[1] = 0;
	for (int i = 2; i <= kMax_N; ++i)
		lg[i] = lg[i >> 1] + 1;
}

void Solve()
{
	ComputeLg();

	fin >> n >> q;
	for (int i = 1; i <= n; ++i)
		fin >> value[i];

	for (int i = 1; i <= n; ++i)
		rmq[i][0] = value[i];

	for (int j = 1; (1 << j) <= n; ++j)
		for (int i = 1; i + (1 << j) - 1 <= n; ++i)
			rmq[i][j] = minV(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j-1]);

	int x, y, k;
	for (int i = 1; i <= q; ++i)
	{
		fin >> x >> y;
		k = log(y - x + 1);
		fout << minV(rmq[x][k], rmq[x + (1 << (k-1))][k]) << '\n';
	}

}

int main()
{
	Solve();
	return 0;
}