Cod sursa(job #423101)

Utilizator Addy.Adrian Draghici Addy. Data 23 martie 2010 15:16:01
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.79 kb
#include <fstream>

using namespace std;

#define NMAX 100050
#define LMAX 20

int X[NMAX], rmq[LMAX][NMAX], lg[NMAX];
int n, m, i, j, x, y, dif, l, sol;

int min(int x, int y) {
	return x < y ? x : y;
}

int main() {
	
	ifstream f("rmq.in");
	ofstream g("rmq.out");
	
	f >> n >> m;
	for (i = 1; i <= n; i++)
		f >> X[i];
	
	for (i = 2; i <= n; i++)
		lg[i] = lg[i >> 1] + 1;
	
	for (i = 1; i <= n; i++)
		rmq[0][i] = X[i];
	
	for (j = 1; (1 << j) <= n; j++)
		for (i = 1; i + (1 << j) - 1 <= n; i++)
			rmq[j][i] = min(rmq[j-1][i], rmq[j-1][i + (1 << (j-1))]);
	
	for (i = 1; i <= m; i++) {
		f >> x >> y;
		
		dif = y - x + 1;
		l = lg[dif];
		sol = min(rmq[l][x], rmq[l][y - (1 << l) + 1]);
		
		g << sol << "\n";
	}
	
	f.close(); g.close();
	
	return 0;
}