Cod sursa(job #1027705)

Utilizator kitzTimofte Bogdan kitz Data 12 noiembrie 2013 22:46:47
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 0.7 kb
#include <fstream>
std::ifstream f ("rmq.in");
std::ofstream g ("rmq.out");
short v[100005], N, M, rmq[20][100005];
short lg[100005];
int main()
{
	f >> N >> M;
	for(int i = 1; i <= N; i++)
		f>>v[i];

	lg[1] = 0;
	for(int i = 2; i <= N; i++)
		lg[i] = lg[i/2]+1;

	for (int i = 1; i <= N; i++)
          rmq[0][i] = v[i];

	 for (int i=1; (1 << i) <= N; i++)
        for (int j=1; j <= N - (1 << i) + 1; j++){
			int ln = 1 << (i-1);
			rmq[i][j]= std::min( rmq[i-1][j] , rmq[i-1][j+ln] );
        }

	for(int i = 1 ; i <= M; i++){
		int l, r;
		f>>l>>r;
		int d = r - l + 1;
		int ln = lg[d];
		int sh = d - (1<<ln);
		g << std::min( rmq[ln][l], rmq[ln][l+sh] ) << "\n";
	}
	return 0;
}