Cod sursa(job #513913)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 17 decembrie 2010 13:12:02
Problema Range minimum query Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include<stdio.h>
#define INF 1 << 29

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

int N,Q,A[100100],j,i,p2[20],E[100100],M[100100][20],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 = 0 ; i <= 100100; ++i )
		for ( j = 0 ; j < 20 ; ++j )
			M[i][j] = INF;
	for ( i = 1 ; i <= N ; ++i ){
		fscanf(f,"%d",&A[i]);
		M[i][0] = A[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 + 1] ; ++j ){
		for ( i = 1 ; i <= N ; ++i )
			M[i][j] = min(M[i][j-1],M[ i + p2[j-1] ][ 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[a][e],M[ b - p2[e] + 1 ] [ e ] ) ;
		
		fprintf(g,"%d\n",R);
	}
	
	fclose(f);
	fclose(g);
	
	return 0;
}