Cod sursa(job #514784)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 19 decembrie 2010 16:21:37
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include<stdio.h>

FILE*f=fopen("rmq.in","r");
FILE*g=fopen("rmq.out","w");

int N,Q,j,i,p2[20],E[100100],M[18][100100],e,a,b,R;

int min ( int a, int b ){
	if( a < b )
		return a;
	return b;
}

int main () {
	
	fscanf(f,"%d %d",&N,&Q);

	for ( i = 1 ; i <= N ; ++i ){
		fscanf(f,"%d",&M[0][i]);
		E[i + 1] = E[(i+1)/2] + 1;
	}
	for ( p2[0] = i = 1 ; p2[i-1] <= 100005; p2[i] = 2 * p2[i-1] , ++i ){}
	
	// M[i][j] = minimul din secventa care incepe la pozitia i si are lungime 2 ^ j
	
	for ( j = 1 ; j <= E[N] ; ++j ){
		for ( i = 1 ; i + p2[j] <= N + 1; ++i )
			M[j][i] = min(M[j-1][i],M [ j - 1][ i + p2[j-1]] );
	}
	
	while ( Q-- ){
		fscanf(f,"%d %d",&a,&b);
		e = E[b - a + 1];
		// e = exponentul celei mai mari puteri de 2 <= b - a + 1
		R = min(M[e][a],M[ e ] [ b - p2[e] + 1 ] ) ;
		
		fprintf(g,"%d\n",R);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}