Cod sursa(job #1048400)

Utilizator roby2001Sirius roby2001 Data 5 decembrie 2013 20:27:33
Problema Range minimum query Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 0.85 kb
/*
          ~Keep It Simple!~
*/




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

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

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

	for(int i=0;i<n;i+=1)
		     scanf("%d",&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];
		}

		int x,y;

	for(int i=1; i <= m; i++ )
	{
		scanf("%d %d",&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("%d\n",A[M[x][k]]);
		else
			printf("%d\n",A[M[y - ( 1 << k )+1][k]]);
	}
}