Cod sursa(job #384956)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 21 ianuarie 2010 21:04:37
Problema Range minimum query Scor 0
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, p;
// 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 (p = 1 << j, i = 1; i + p - 1 <= N; i++) // i + 2 ^ (j-1)
			RMQ [i][j] =  min (RMQ [i] [j - 1], RMQ [ i + p - 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;
		k = log [k];
		fout << min ( RMQ [i] [k], RMQ [j - (1 << k) + 1 ] [k]) << "\n";
	}

}





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