Cod sursa(job #350660)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 25 septembrie 2009 10:45:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include <stdio.h>
#define N 1<<17
#define M 1<<5
int n,m,x,y,l;
int v[N],lg[N],rmq[M][N];
/*
    rmq[i][j]=cel mai mic elem din subescventa j+2^i-1
*/
inline int min(int a,int b)
{
	if (a<b)
		return a;
	return b;
}
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j,t,k;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		lg[i]=i>=2 ? lg[i/2]+1 : 0;//calculez lg in baza 2 din i
		rmq[0][i]=v[i];
	}
	for (i=1; (1<<i)<=n; i++)
	{
		t=1<<i;
		k=1<<(i-1);
		//fac minimul pe jumatati de interval
		for (j=1; j<=n-t+1; j++)
			rmq[i][j]=min(rmq[i-1][j],rmq[i-1][(j+t-1)-k+1]);
	}
	for (i=1; i<=m; i++)
	{
		scanf("%d%d",&x,&y);
		l=lg[y-x+1];
		t=1<<l;
		printf("%d\n",min(rmq[l][x],rmq[l][y-t+1]));
		/*fach minimul dintre minimele intervalelelor :
		1. (x,x+2^l-1)
		2. (y-x^l+1, y)*/
	}
	return 0;
}