Cod sursa(job #339774)

Utilizator prdianaProdan Diana prdiana Data 11 august 2009 15:02:16
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.75 kb
#include <stdio.h>
#define MAXN 100002
#define LOGN 17

int rmq[MAXN][LOGN];
int a[MAXN];
int lg[MAXN];
int best(int v1,int v2)
{
	if (v1<v2)
	{
		return v1;
	}
	return v2;
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	int n,m,i,j,k,x,y;

	scanf("%d%d",&n,&m);
	for (i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	
	for (i=0;i<n;i++)
	{
		rmq[i][0] = a[i];
	}

	lg[1] = 0;
    for (i=2;i<=n;i++) 
	{
        lg[i]=lg[i/2]+1;  
	}

	for (j=1 ; 1<<j <= n;j++)
	{
		for (i=0;i+(1<<j)-1<n;i++)
		{
			rmq[i][j] = best(rmq[i][j-1],rmq[i+(1<<(j-1))][j-1]);
		}
	}

	for (i=0;i<m;i++)
	{
		scanf("%d%d",&x,&y);
		k = lg[y-x+1];
		printf("%d\n",best(rmq[x][k],rmq[y-(1<<k)][k]));
	}
	return 0;
}