Cod sursa(job #1365535)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 28 februarie 2015 12:46:42
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define NMAX 100023
FILE *fin, *fout;
int min(int a, int b)
{
	return (a< b)?a:b;
}
int log(int a)
{
	if(a == 1) return 0;
	return 1 + log(a/2);
}
int n, m, d[20][NMAX], size, x, y;
int query(int a, int b)
{
	int sizen = b-a+1;
	sizen = log(sizen);
	//printf("check : sizen = %d st1 = %d dr1 = %d st2 = %d dr2 = %d nr1 = %d nr2 = %d\n", sizen, a, a + (1<<sizen) - 1, b - (1<<sizen) + 1, b, d[sizen][a], d[sizen][b - (1<<sizen) + 1]);
	return min(d[sizen][a], d[sizen][b - (1<<sizen) + 1]);
}
int main()
{
	fin = freopen("rmq.in", "r", stdin);
	fout = freopen("rmq.out", "w", stdout);
	scanf("%d%d", &n, &m);
	size = log(n);
	for(int i = 0; i<= size; i++)
	{
		for(int j = 0; j< n; j++)
		{
			if(i == 0)
			{
				scanf("%d", &d[i][j]);
			}
			else
			{
				if(j + (1<<i) > n) break;
				d[i][j] = min(d[i-1][j], d[i-1][j + (1<<(i-1))]);
			}
		}
	}
	/*for(int i = 0; i< n; i++)
	{
		for(int j = 0; j<= size; j++)
		{
			if(d[j][i]) printf("%d ", d[j][i]);
		}
		printf("\n");
	}*/
	for(int i = 0; i< m; i++)
	{
		scanf("%d %d", &x, &y);
		x--;
		y--;
		printf("%d\n", query(x, y));
	}
	fclose(fin);
	fclose(fout);
	return 0;
}