Cod sursa(job #820017)

Utilizator nimeniaPaul Grigoras nimenia Data 19 noiembrie 2012 22:41:20
Problema Range minimum query Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <fstream>
#include <cmath>

using namespace std;

int main() {

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

	int n, m;

	inf >> n >> m;

	int nums[n+1];

	for (int i = 0; i < n; i++)
		inf >> nums[i];

	// pre process rmq
	int logn  = log2(n);
	int rmq[n][logn]; // TODO maybe + 1?

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

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

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

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

		outf << res << endl;
	}

	return 0;
}