Cod sursa(job #401219)

Utilizator laserbeamBalan Catalin laserbeam Data 22 februarie 2010 17:31:57
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
// Catalin Balan
// Mon Feb 22 17:13:02 EET 2010
// Infoarena.ro - Range Minimum Query

#include <cstdio>
#include <cstdlib>

using namespace std;

#define	NMAX 100003
#define LOGMAX 18
#define CHUNK 8192

#define FIN "rmq.in"
#define FOUT "rmq.out"

#define min(a,b) (a<b?a:b)

char g_buf[CHUNK];
int g_p=CHUNK-1;

inline int get(FILE *f)
{

	int x = 0;
	while (g_buf[g_p] < '0' || g_buf[g_p] > '9')
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;

	while (g_buf[g_p] >= '0' && g_buf[g_p] <= '9')
	{
		x = x*10 + g_buf[g_p]-'0';
		if (++g_p == CHUNK) fread(g_buf,1,CHUNK,f), g_p=0;
	}
	return x;
}


int a[NMAX][LOGMAX], lg[NMAX];
int n,m,len,k,x,y;

int main(int argv, char ** argc)
{
	FILE *f = fopen(FIN, "r");
	FILE *g = fopen(FOUT, "w");

	n = get(f);
	m = get(f);
	a[1][0] = get(f);
	lg[1] = 0;
	for (int i = 2; i <= n; ++i) 
	{
		a[i][0] = get(f);
		lg[i] = lg[i>>1]+1;
	}

	for (int i = 1; i <= lg[n]; ++i)
	{
		len = 1<<i;
		for (int j = 1; j <= n - len + 1; ++j)
		{
			a[j][i] = min(a[j][i-1], a[j+len/2][i-1]);
		}

	}

	for (;m;--m)
	{
		x = get(f); y = get(f);
		len = y-x+1;
		k = lg[len];
		fprintf(g,"%d\n", min( a[x][k], a[y - (1<<k) + 1 ][k] ) );

	}

	fclose(f);
	fclose(g);
	return EXIT_SUCCESS;
}