Cod sursa(job #608520)

Utilizator andreioneaAndrei Onea andreionea Data 17 august 2011 00:38:40
Problema Range minimum query Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.15 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define infile "rmq.in"
#define outfile "rmq.out"

inline int min(const int a, const int b)
{
	return a<b?a:b;
}
inline int max(const int a, const int b)
{
	return a>b?a:b;
}
int main()
{
	int N, M;
	FILE *f = fopen(infile, "r");
	FILE *g = fopen(outfile, "w");
	int *logTable;
	int *numbers;
	int **rmq;
	int i, j, k;
	int maxI;
	fscanf(f,"%d%d",&N,&M);
	numbers = (int*)malloc(sizeof(int)*N);
	for(i = 0; i < N; ++i)
		fscanf(f,"%d", &numbers[i]);
	logTable = (int*)malloc(sizeof(int)*N);
	logTable[0] = logTable[1] = 0;
	for(i = 2; i<N; ++i)
		logTable[i] = 1 + logTable[i/2];
	maxI = logTable[N/2] + 2;
	rmq = (int**)malloc(sizeof(int*)*N);
	for(i = 0; i<N; ++i){
		rmq[i] = (int*)malloc(sizeof(int)*maxI);
		rmq[i][0] = numbers[i];
	}
	for(j = 1; j<maxI; ++j)
		for(i = 0; i<N; ++i)
		 rmq[i][j] = min(rmq[i][j-1], rmq[min(i + (1<<(j-1)),N-1)][j-1]);
		 
	for(k = 0; k<M; ++k){
		int x;
		fscanf(f,"%d%d",&i,&j);
		x = logTable[j-i+1];
		fprintf(g,"%d\n",min(rmq[i-1][x], rmq[j-(1<<x)][x]));
	}
	fclose(f);
	fclose(g);
	for(i = 0; i<N; ++i)
		free(rmq[i]);
	free(rmq);
	free(numbers);
	free(logTable);
	return 0;
}