Cod sursa(job #178894)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 15 aprilie 2008 12:55:04
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.72 kb
#include <stdio.h>
#include <math.h>
#define Max 100005  
#define LgMax 17  
int a[Max],n,m;  
int rmq[LgMax][Max];  
int lg[Max]; 
inline int  min(int xx,int yy)
{
	if(xx<yy) return xx;
	return yy;
}
void scan()
{
	freopen("rmq.in", "r",stdin);
	freopen("rmq.out", "w",stdout);
	scanf("%d%d", &n,&m);
	for(int i=1;i<=n;++i)
		scanf("%d", &rmq[0][i]);
}		
void solve()
{
	int i,j;
	for(i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
	for(i=1;i<=lg[n];i++)
		for(j=1;j+(1<<i)-1<=n;j++)
			rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+(1<<(i-1))]);
	for(;m>=1;--m)
	{
		scanf("%d%d", &i,&j);
		int k=lg[j-i+1]; 
		printf("%d\n", min(rmq[k][i],rmq[k][j-(1<<k)+1])  );
	}
}	
int main()
{
	scan();
	solve();
	return 0;
}