Cod sursa(job #254064)

Utilizator willliIonel Bratianu willli Data 6 februarie 2009 18:01:12
Problema Range minimum query Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 1.41 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 100001
#define LOGMAX 18
#define in "rmq.in"
#define out "rmq.out"

unsigned int a[MAX], M[MAX][LOGMAX], n;

void process_matrix()
{
	unsigned int i,j;
	
	for (j = 1 ; 1 << j <= n; j++)
		for (i = 1 ; i <= n; i++)
			if (a[M[i][j-1]] <= a[M[i + (1<<(j - 1))][j-1]])
				M[i][j] = M[i][j-1];
			else
				M[i][j] = M[i + (1<<(j-1))][j-1];
}

int main()
{
	unsigned int i, z, m, x, y,j;
	FILE *fin, *fout;
	
	if ((fin = fopen(in, "r")) == NULL)
	{
		printf("Eroare \n");
		exit(-1);
	}
	//read dimension of vectors
	fscanf(fin, "%d%d", &n, &m);

	//read the vectors
	for (i = 1; i<=n ; i++)
	{
		fscanf(fin, "%d", &a[i]);
		M[i][0] = i;
	}
	process_matrix();
	/*
	for (i = 1; i <= n; i++)
	{
		for (j = 0; 1 << j <= n; j++)
			printf("%d ", M[i][j]);
		printf("\n");
	}
	*/
	fout = fopen(out, "w");
	
	for (i = 0; i < m; i++)
	{
		fscanf(fin, "%d%d", &x, &y);
		//printf("%d %d\n", x, y);
		z = log(y - x + 1) / M_LN2;
		//printf("%d x+ 1 <<z %d\n", z, x + (1<<z));
		if (y == x + (1 << z) -1)
		{
			fprintf(fout, "%d\n", a[M[x][z]]);
		}
		else
		if (a[M[x][z]] <= a[M[x + (1 << z)][z-1]])
		{
			//printf("\nM[%d][%d] = %d\n", x, z, M[x][z]);
			fprintf(fout, "%d\n", a[M[x][z]]);
		}
		else
		{
			//printf("\nM[%d][%d] = %d\n", x + (1 << z), z - 1, M[x + (1 << z)][z-1]);
			fprintf(fout, "%d\n", a[M[x + (1 << z)][z-1]]);
		}
	}
	fclose(fin);
	fclose(fout);
	return 0;
}