Cod sursa(job #829742)

Utilizator horeste12Stoianovici Horatiu Andrei horeste12 Data 5 decembrie 2012 19:54:50
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <stdio.h>
#include <vector>

using namespace std;

int log2(int x)
{
	return (int)(log(x) / log(2));
}

int rmq(int x, int y, int *vect, int lg1)
{
	static int *lg, **rmq, n, *a = NULL;
	static int lMax;
	int l, diff, sh;

	if(vect != a)
	{
		a = vect;
		n = lg1;

		//memory allocation
		lg = (int *) malloc((n + 1) * sizeof(int));
		lMax = log2(n) + 1;
		rmq = (int **) malloc((lMax + 1) * sizeof(int*));
		for(int i = 0; i <= lMax; i++)
			rmq[i] = (int *) malloc((n + 1) * sizeof(int*));
		
		//computing the values
		lg[1] = 0;
		for (int i = 2; i <= n; i++)
			lg[i] = lg[i/2] + 1;

		for (int i = 1; i <= n; i++)
			rmq[0][i]= a[i];

		for (int i=1; (1 << i) <= n;i++)
		{
			for (int j = 1; j <= n - (1 << i) + 1; j++)
			{
				l = 1 << (i - 1);
				rmq[i][j]= min(rmq[i-1][j] , rmq[i-1][j+l]);
			}
		}
	}

	//calculating required Range Minimum Query
	diff = y - x + 1;
	l = lg[diff];
	sh = diff - (1 << l);
	return min(rmq[l][x], rmq[l][x+sh]);   
}

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

	int *vect;
	int n, m, a, b;

	scanf("%d%d", &n, &m);
	
	vect = (int*) malloc((n + 1) * sizeof(int));

	for(int i = 1; i <= n; i++)
		scanf("%d", vect + i);

	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d", &a, &b);
		printf("%d\n", rmq(a, b, vect, n));
	}

	return 0;
}