Cod sursa(job #517817)

Utilizator auRSTARHreapca Aurelian auRSTAR Data 29 decembrie 2010 22:30:02
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.62 kb
#include<cstdio>
#define min(a,b) a<b?a:b
void read(),solve();
int i,j,n,a[20][100010],lg[100010],L,s,x,y,m;
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
		scanf("%d",&a[0][i]);
	lg[1]=0;
	for(i=2;i<=n;i++)
		lg[i]=lg[i>>1]+1;
}
void solve()
{
	for(i=1;(1<<i)<=n;i++)
		for(j=1;j<=n-(1<<i)+1;j++)
		{
			L=1<<(i-1);
			a[i][j]=min(a[i-1][j],a[i-1][j+L]);
		}
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		L=lg[y-x+1];
		s=(y-x+1)-(1<<L);
		printf("%d\n",min(a[L][x],a[L][x+s]));
	}
}