Cod sursa(job #1048405)

Utilizator roby2001Sirius roby2001 Data 5 decembrie 2013 20:31:51
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
/*
          ~Keep It Simple!~
*/




#include <stdio.h>
long int A[100001],M[100001][18],n,m,log[100001];

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

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

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

	for( int i = 2; i <= n; i++ )
	   log[ i ] = log [ i/2 ] + 1; 
	
	for(int i=0; i < n; i++)
		M[i][0] = i;

	for(int j = 1; 1<<j <= n; j++ )
	    for(int i = 0; i + (1<<j) - 1  < n; i++)
		{
			if ( A[M[i][j-1]] < A[M[i + (1 << (j-1))][j-1]] )
				M[i][j] = M[i][j-1];
			else
				M[i][j] = M[i + (1 << (j-1))][j-1];
		}

		long int x,y;

	for(int i=1; i <= m; i++ )
	{
		scanf("%ld %ld",&x,&y);
		x -= 1;
		y -= 1;
		int k = log[y-x+1];
		if( A[M[x][k]] <= A[M[y - ( 1 << k )+1][k]])
			printf("%ld\n",A[M[x][k]]);
		else
			printf("%ld\n",A[M[y - ( 1 << k )+1][k]]);
	}
}