Cod sursa(job #154905)

Utilizator butyGeorge Butnaru buty Data 11 martie 2008 16:09:22
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include<stdio.h>
#include<math.h>
const int Nmax=50001;
int A[Nmax],B[16][Nmax],N,M,pw2[17];
void cit()
{
	int i;
	freopen("rmq.in","r",stdin);
	scanf("%d%d",&N,&M);
	for(i=0;i<N;i++)
		scanf("%d",&A[i]);
}
void pw2pp()
{
	int i;
	pw2[0]=1;
	for(i=1;i<=16;i++)
		pw2[i]=pw2[i-1]+pw2[i-1];
}
void preprocM()
{
	int l=(int)log2(N),k=1,i,j;
	for(i=0;i<N;i++)
		B[0][i]=i;


	for(i=1;i<=l;i++)
		for(j=0;j<N-pw2[i]+1;j++)
			B[i][j]=A[B[i-1][j]]<A[B[i-1][j+pw2[i-1]]] ? B[i-1][j] : B[i-1][j+pw2[i-1]];
}
int rmq(int a,int b)
{
	int k=(int)log2(b-a+1);
	return A[B[k][a]] < A[B[k][b-pw2[k]+1]] ? A[B[k][a]] : A[B[k][b-pw2[k]+1]];
}
void rez()
{
	int i,a,b;
	freopen("rmq.out","w",stdout);
	int j;
	for(i=0;i<M;i++)
	{
		scanf("%d%d",&a,&b);
		printf("%d\n",rmq(a-1,b-1));
	}
}
int main()
{
	cit();
	pw2pp();
	preprocM();
	rez();
	return 0;
}