Cod sursa(job #743283)

Utilizator danalex97Dan H Alexandru danalex97 Data 3 mai 2012 21:02:20
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <stdio.h>
#include <vector>

using namespace std;

#define NMAX 100002
#define LMAX 18

#define Li long int
#define min(a,b) ( (a<b) ? a : b )

Li rmq[LMAX][NMAX];
Li N,Q;
Li lg[NMAX],A[NMAX];

Li x,y,diff,sh,l,Sol;

void loog()
{
	lg[1]=0;
	for (Li i=2;i<=N;++i)
		lg[i]=lg[i/2]+1;
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	scanf("%ld %ld",&N,&Q);

	for (Li i=1;i<=N;++i)
		scanf("%ld ",&A[i]);

	for (Li i=1;i<=N;++i)
		rmq[0][i]=A[i];

	for (Li i=1; (1 << i) <=N;++i)
		for (Li j=1;j <= N - (1 << i)+1;++j)
			l=1<<(i-1),
			rmq[i][j]= min( rmq[i-1][j] , rmq[i-1][j+l] );
	
	for (Li i=1;i<=Q;i++)
	{
		scanf("%ld %ld",&x,&y);
		
		diff=y-x+1;
		l=lg[diff];
		
		sh=diff - (1<<l);
		Sol=min(rmq[l][x],rmq[l][x+sh]);
		
		printf("%ld\n",Sol );
	}	
	return 0;
}