Cod sursa(job #1427866)

Utilizator PatrikStepan Patrik Patrik Data 3 mai 2015 10:20:30
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<stdio.h>


#define NMAX 100001
#define KMAX 20

int n , q , v[NMAX] , rmq[NMAX][KMAX],log[NMAX];
int min(int a , int b){
	if(a < b)return a;
	return b;
}

int main()
{
	int a , b;
	freopen("rmq.in" , "r" , stdin );
	freopen("rmq.out" , "w" , stdout );
	scanf("%d%d" , &n , &q);
	for(int i = 1 ; i <= n ; ++i )
		scanf("%d" , &v[i]) ;
	for(int i = 1 ; i <= n ; ++i )
		rmq[i][0] = v[i];
	for(int k = 1 ; (1<<k) <= n ; ++k )
		for(int i = 1 ; i+(1<<k)-1 <= n ; ++i )
			rmq[i][k] = min(rmq[i][k-1],rmq[i+(1<<(k-1))][k-1]);

	for(int i = 2 ; i <= n ; ++i )
		log[i] = log[i/2]+1;
	for(int i = 1 ; i <= q; ++i ){
		scanf("%d%d" , &a , &b );
		int k = log[b-a];
		printf("%d\n" , min(rmq[a][k],rmq[b-(1<<k)+1][k]));
	}
	return 0;
}