Cod sursa(job #743943)

Utilizator Stefex09Stefan Teodorescu Stefex09 Data 6 mai 2012 20:57:30
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<iostream>
#include<fstream>

using namespace std;

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

const int maxn = 100010;

long m, n, rmq[18][maxn], lg[maxn], a[maxn], dif, now, x, y;

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

int main()
{
	int i, j, k;
	
	in >> n >> m;
	
	for(i = 1; i <= n; ++i)
		in >> a[i];
	
	lg[1] = 0;
	
	for(i = 2; i <= n; ++i)
		lg[i] = lg[i >> 1] + 1;
	
	for(i = 1; i <= n; ++i)
		rmq[0][i] = a[i];
	
	for(i = 1; (1 << i) <= n; ++i)
		for(j = 1; j <= n - (1 << i) + 1; ++j){
			k = 1 << (i - 1);
			
			rmq[i][j] = minim(rmq[i-1][j], rmq[i-1][j+k]);
		}
	
	for(i = 1; i <= m; ++i){
		in >> x >> y;
		
		dif = y - x + 1;
		k = lg[dif];
		now = dif - (1 << k);
		out << minim(rmq[k][x], rmq[k][x + now]);
	}
	
	return 0;
}