Cod sursa(job #385341)

Utilizator jeanFMI - Petcu Ion Cristian jean Data 22 ianuarie 2010 16:59:31
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include<stdio.h>
#define Nmax 100010

int v[Nmax],M[Nmax][20],i,n,x,y,m,j;

int rmq(int i, int j)
{
	int k=0,val=j-i+1;
	while(val!=1)
	{
		k++;
		val>>=1;
	}
	
	if( M[i][k] < M[ j - (1<<k) +1 ] [k] )
		return M[i][k];
	
	return M[ j - (1<<k) +1 ] [k];
}


int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	scanf("%d %d",&n,&m);
	
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
	
	for(i=1;i<=n;i++)
		M[i][0]=v[i];
	
	for(j=1; (1<<j) <=n ;j++)
		
		for(i=1; i+(1<<j)-1 <= n; i++)
			
			if( M[ i + (1<<(j-1)) ] [j-1] < M[i][j-1] )
				M[i][j]=M[ i + (1<<(j-1)) ] [j-1];
			
			else M[i][j]=M[i][j-1];
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d",&x,&y);
		printf("%d\n",rmq(x,y));
	}
	return 0;
}