Cod sursa(job #795340)

Utilizator MtkMarianHagrSnaf MtkMarian Data 8 octombrie 2012 13:01:27
Problema Range minimum query Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<cstdio>
#define NMAX 100002

long int n, m,a[NMAX],minim,mr[NMAX]={-1},x1,y1;


void update(long int nod,long int left,long int right)
{

	if( left == right ) mr [ nod ]=left;
	
	else
		{

		int mid=(left+right)/2;

		update(  2 * nod, left ,mid);
		update( 2 * nod+1, mid+1,right);	

		if(a [ mr [ 2 * nod ] ] < a [ mr [2*nod+1] ] ) mr [ nod ] = mr [ 2 * nod ] ;
			
			else  mr [ nod ] =mr [ 2 * nod+1 ] ;
		}
}

long int query(long int nod,long int left,long int right)
{
	
	if(left>y1 || right < x1)
		return -1;

	if( x1 <= left && right <= y1 )
		return mr[nod];

	long int p1,p2;

	long int  mid=(left+right)/2;

	p1=query ( 2*nod ,left , mid );
	p2=query( 2*nod+1 , mid+1  , right );


	if( p1 == -1 )return p2;
	if( p2 == -1 ) return p1;

	if( a [ p1 ] <= a [ p2 ] ) return p1;
	return  p2;
}



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

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

	for(int i=1;i<=n;++i)	
		scanf("%d",&a[i]);		

	
	update(1,1,n);



	for(int i=1;i<=m;++i)
	{
		scanf("%d %d",&x1,&y1);		
		minim=query(1,1,n);		
		printf("%d\n",a[minim]);
	}

	return 0;
}