Cod sursa(job #675071)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 7 februarie 2012 09:22:17
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <fstream>
using namespace std;

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

const int dim = 100005, lgm = 20;
int N, M, A[lgm][dim], P2[dim];

void init ()
{
	fi >> N >> M;
	for (int i = 1; i <= N; i++)
		fi >> A[0][i];
	
	P2[1] = 0;
	for (int i = 2; i <= dim ; i++)
		P2[i] = P2[i>>1] + 1;
	
	for (int j = 1; (1 << j) <= N; j++)
	{
		for (int i = 1; i + (1 << j) - 1 <= N; i++)
		{
			A[j][i] = min (A[j - 1][i], A[j - 1][i + (1 << (j - 1))]);
		}
	}
}

int query (int a, int b)
{
	int j = P2[b - a + 1];
	return min (A[j][a], A[j][b + 1 - (1 << j)]);
}

int main ()
{
	init ();
	int a, b;
	while ( M-- )
	{
		fi >> a >> b;
		fo << query (a, b) << '\n';
	}
	return 0;
}