Cod sursa(job #2200955)

Utilizator emiemiEmi Necula emiemi Data 2 mai 2018 22:14:53
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <fstream>

using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");

int n, m;

int log2(int a) {
	int l = 0, x = 1;
	while (x <= a) {
		x <<= 1;
		++l;
	}
	return (l - 1);
}

int expLog2(int a) {
	int x = 1;
	while (x <= a) x <<= 1;
	return (x >> 1);
}

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

int main() {
	int i, j, x, y, k, put2, lim;
	f >> n >> m;

	int len = log2(n) + 1;
	int **a = (int **)malloc((n + 1) * sizeof(int *));
	for (i = 1; i <= n; ++i)
		a[i] = (int *)malloc(len * sizeof(int *));

	for (i = 1; i <= n; ++i)
		f >> a[i][0];

	for (k = 1; k < len; ++k) {
		put2 = 1 << k;
		lim = n - put2 + 1;
		put2 >>= 1;

		for (i = 1; i <= lim; ++i) {
			a[i][k] = minim(a[i][k - 1], a[i + put2][k - 1]);
		}
	}
		
	for (j = 0; j < m; ++j) {
		f >> x >> y;
		lim = y - x + 1;
		//if (lim < 0)
		//	lim = -lim;
		//++lim;
		put2 = log2(lim);
		g << minim(a[x][put2], a[x + lim - (1 << put2)][put2]) << '\n';
	}

	return 0;
}