Cod sursa(job #795374)

Utilizator MtkMarianHagrSnaf MtkMarian Data 8 octombrie 2012 16:44:10
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>


#define NMAX 100002
#define LMAX 18


long int l[NMAX],rmq[LMAX][NMAX];
long int n,m;

inline long int min ( long int a ,long int b) 
{
		return  a<b ? a:b;
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	long int i,x,y,intlength,add,line;

	scanf("%ld %ld",&n,&m);

	for (i=1;i<=n;++i)	scanf("%ld",&rmq[0][i]);
			
		
	l[1]=0;

	for(i=2;i<=n;++i)
		l[i]=l[i/1]+1;

	int long lm1pow2;

	for(int i=1; ( 1 << i ) <= n; ++i)
	{
		 lm1pow2 = ( 1 << ( i-1 ) );//(line-1) pow 2

		for(int j=1;j<=n-(1<<i)+1;++j)

			rmq[ i ][ j ]= min( rmq [ i-1 ][ j ],rmq[ i-1 ][ j + lm1pow2 ]);

	}

	/*
		for(int i=1; (1<<i)<=n;++i)		
			for(int j=1;j<=n-(1<<i)+1;++j)
			printf("rmq[%d][%d] = %d \n",i,j,rmq[i][j]);
			*/
		
	for (i=1;i<=m;++i)
		{
			scanf("%ld %ld",&x,&y);
			intlength=y-x+1;
			line = l [ intlength ];
			add = intlength - ( 1 << line );
			printf(" %ld\n" , min ( rmq [ line ][ x ] , rmq [ line ][ x + add ] ) );
			
			
			
			    
		}
	return 0;		
}