Cod sursa(job #690127)

Utilizator balakraz94abcd efgh balakraz94 Data 25 februarie 2012 11:28:06
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <cstdio>
#include<algorithm>
#define infile "rmq.in"
#define outfile "rmq.out"
#define n_max 100005
#define log_max 18
using namespace std;

int A[n_max], log[n_max];

int RMQ [n_max][log_max];

int N, M;


void MakeRMQ()
{
	for(int i=2; i<=N; ++i)
		log[i] = log[i>>1] + 1;
	
	for(int i=0; i<N; ++i)
		RMQ[i][0] = i;
	
	for(int j = 1; (1<<j) <= N; ++j)
		for(int i=0; (i + (1<<j) - 1) < N; ++i)
			if(A[RMQ[i][j-1]] < A[RMQ[i + (1<<(j-1))][j-1]])
				RMQ[i][j] = RMQ[i][j-1];
			else
				RMQ[i][j] = RMQ[i + (1<<(j-1))][j-1];
}



int main()
{
	freopen(infile, "r", stdin);
	freopen(outfile, "w", stdout);
	
	int x, y;
	
	scanf("%d %d", &N, &M);

	for(int i=0;i<N;i++)
		scanf("%d",&A[i]);
	
	MakeRMQ();
	
	while(M--)
	{
		scanf("%d %d", &x, &y);
		
		x--;
		y--;
		
		int k = log[y - x +1] ;
		
		printf("%d\n", min(A[RMQ[x][k]], A[RMQ[y - (1<<k) + 1][k]]));
	}
	
	fclose(stdin);
	fclose(stdout);

	return 0;
}