Cod sursa(job #384843)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 21 ianuarie 2010 10:13:57
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include <fstream>
#define DIMN 100005
#define DIML 25

using namespace std;

ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
int RMQ [DIMN][DIML], x, log [DIMN], i, j, N, M, k;
// RMQ [i][j] - > subsecventa de lungime 2^j avand inceputul in i ; 
inline int min (int a, int b) { 
        if (a <= b) return a;
 return b;
}
inline void solve ()
{
	fin >> N >> M;
	fin >> x;
	RMQ [1][0] = x;
	for (i = 2; i <= N; i++) { 
		fin >> x;
		RMQ [i][0] = x;
		log [i] = log [i >> 1] + 1; 
	}
	for (j = 1; (1 << j) <= N; j++)
		for (i = 1; i + (1 << j) - 1 <= N; i++) // i + 2 ^ (j-1)
			RMQ [i][j] =  min (RMQ [i] [j - 1], RMQ [ i + (1 << (j - 1)) ] [j - 1]) ;
			// intervalul ce incepe cu i sau i + 2^j-1 - 1 de lungime 2 ^ j - 1 ( in total 2^j );
	while (M--)
	{
		fin >> i >> j;
		k = j - i + 1;
		fout << min ( RMQ [i] [log [k]], RMQ [j - (1 << log [k]) + 1 ] [log [k]]) << "\n";
	}

}





int main ()
{   
	solve ();    
	return 0;
	// stiu...cam sec main-ul :)
}