Cod sursa(job #407799)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 2 martie 2010 17:27:35
Problema Range minimum query Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 0.73 kb
#include<stdio.h>
#define nmax 100010
int nr[nmax], rmq[nmax][20], log[nmax], n, m, i, j, x, y;

int min(int x, int y)
{	if(nr[x]<nr[y])	return x;
	else			return y;
}

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

int main()
{	int k, rez;
	freopen("rmq.in", "r", stdin);
	freopen("rmq.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for(i=0; i<n; i++)
	{	scanf("%d", &nr[i]);
		rmq[i][0]=i;
	}
	for(i=2; i<=n; i++)	log[i]=log[i/2]+1;
	
	create_rmq();
	
	for(i=1; i<=m; i++)
	{	scanf("%d%d", &x, &y);
		x--; y--;
		k=log[y-x+1];
		rez=min(rmq[x][k], rmq[y+1-(1<<k)][k]);
		printf("%d\n", nr[rez]);	
	}
	
	return 0;
	
}