Cod sursa(job #666251)

Utilizator razvan2006razvan brezulianu razvan2006 Data 22 ianuarie 2012 11:41:42
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#include<vector>
using namespace std;

#define NMAX 100000
#define LMAX 18

long i, j, n, sir[NMAX], rmq[LMAX][NMAX], lg[NMAX], m;

int main()
{
	freopen("rmq.in", "rt", stdin);
	freopen("rmq.out", "wt", stdout);

	scanf("%ld%ld", &n, &m);
	
	lg[1] = 0;
	for(i = 2; i <= n; i++)
		lg[i] = lg[i / 2] + 1;
	
	for(i = 1; i <= n; i++)
	{
		scanf("%ld", &sir[i]);
		rmq[0][i] = sir[i];
	}
	
	long l;
	for(i = 1; (1 << i) <= n; i++)
		for(j = 1; j <= n - (1 << i) + 1; j++)
		{
			l = (1 << (i - 1));
			if(rmq[i - 1][j] < rmq[i - 1][j + l])
				rmq[i][j] = rmq[i - 1][j];
			else
				rmq[i][j] = rmq[i - 1][j + l];
		}
		
		
	long x, y, dif;
	for(i = 1; i <= m; i++)
	{
		scanf("%ld %ld", &x, &y);
		dif = (y - x + 1); l = (1 << lg[dif]);
		printf("%ld\n", min(rmq[lg[dif]][x], rmq[lg[dif]][x + (dif - l)]));
	}
		
	return 0;
}