Cod sursa(job #795380)

Utilizator MtkMarianHagrSnaf MtkMarian Data 8 octombrie 2012 16:55:03
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 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 x,y,intlength,add,line;

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

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

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

	int long lm1pow2;

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

		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;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;		
}