Cod sursa(job #820085)

Utilizator nimeniaPaul Grigoras nimenia Data 20 noiembrie 2012 00:02:15
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <iostream>
#include <fstream>

using namespace std;

#define MAX     100002
#define LOGMAX  18

long int log2[MAX];
long int rmq[MAX][LOGMAX];
long int nums[MAX];

long int n, m;

int main() {

	freopen("rmq.in","r",stdin);
	freopen("rmq.out", "w", stdout);

	long int i, j;
	scanf("%ld %ld", &n, &m);

	for (int i = 1; i <= n; i++)
		scanf("%ld", &nums[i]);

	// compute log table
	log2[1] = log2[0] = 0;
	for (i = 2; i <= n; i++)
		log2[i] = log2[i/2]+1;

	// preprocess rmq
	for (i = 1; i <= n; i++)
		rmq[i][0] = i; // intervals of length 2^0 = 1

	for (j = 1; (1 << j) <= n; j++)
		for (i = 1; i + (1 << j) - 1 <= n; i++) {
			long int minSeg1 = rmq[i][j-1];  
			long int minSeg2 = rmq[i + (1 << (j-1))][j-1];
			if (nums[minSeg1] < nums[minSeg2])
				rmq[i][j] = minSeg1;
			 else 
				rmq[i][j] = minSeg2;
		}

	long int a, b;
	for (i = 0; i < m; i++) {

		scanf("%ld %ld", &a, &b);

		// process query
		long int k = log2[b - a + 1];
		long int res = min(nums[rmq[a][k]], 
		              nums[rmq[b - (1 << k) + 1][k]]);

		printf("%ld\n", res);
	}

	return 0;
}