Cod sursa(job #189960)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 19 mai 2008 14:59:33
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

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

#define NMAX 100005
#define LOGMAX 18

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



int RMQ[LOGMAX][NMAX], POW[NMAX];
int N, M;

void build()
{
	int i, j;
	for( j = 1; j < LOGMAX; j++ )
		for( i = 1; i <= N - ( 1 << j ) + 1; i++ )
		RMQ[j][i] = MIN( RMQ[j-1][i], RMQ[j-1][i+( 1<<(j-1))]);
}

void compute()
{
	int i, step = 0;
	while( 1 << step <= N )
		POW[ 1 << step ] = step++;
	for( i = 2; i <= N; i++ )
		if( !POW[i] ) 
			POW[i] = POW[i-1];
}


int main()
{
	int l, r;
	FILE * fin = fopen( FIN, "r");
	FILE * fout = fopen( FOUT, "w");
	fscanf( fin, "%d%d", &N, &M );
	for( int i = 1; i <= N; i++ )
		fscanf( fin, "%d", &RMQ[0][i] );
	build();
	compute();
	while( M-- )
	{
		fscanf( fin, "%d%d", &l, &r );
		int step = POW[r-l+1];
		fprintf( fout, "%d\n", MIN( RMQ[step][l], RMQ[step][r - ( 1 << step ) + 1]));
	}
	
	return 0;
	
}