Cod sursa(job #403711)

Utilizator ErgoVicol Sergiu Constantin Ergo Data 25 februarie 2010 10:53:18
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>

#define NMAX 100000
#define LGMAX 20
#define INFI 200000

using namespace std;

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

int N, M, Min[LGMAX][NMAX], lg[NMAX], A[NMAX];

inline int minim(int a, int b)
{
	if (a < b) return a;
	return b;
}

void Citire(void)
{	
	int i;
	fin >>N >>M;
	for (i = 1; i <= N; i++)
		fin >>A[i];
}

void GenereazaMin(void)
{
	int i, j;
	
	//Intai preprocesam logaritmii
	for (i = 2; i <= N; i++)
		lg[i] = lg[i / 2] + 1;
	
	//Acum Generam Matricea R
	for (i = 1; i <= N; i++)
		Min[0][i] =  A[i];
	
	for (i = 1; i <= N; i++)
		for (j = 1; j <= lg[N]; j++)
			Min[j][i] = INFI;
	
	for (j = 1; (1 << j) <= N; j++)
		for (i = 1; i + (1 << j) - 1 <= N; i++)
		{
			Min[j][i] = minim(Min[j-1][i], Min[j-1][i + (1 << (j - 1))]);
		}
	
}



void Rezolva()
{
	int s, d, i;
	
	for (i = 1; i <= M; i++)
	{
		fin >>s >>d;
		fout << minim(Min[lg[d- s + 1]][s] ,Min[lg[d- s +1]][d + 1 - (1 << lg[d-s+1])]) <<'\n';
	}

	fin.close();
	fout.close();
}

int main()
{
	Citire();
	
	GenereazaMin();
	
	Rezolva();

	return 0;
}