Cod sursa(job #729342)

Utilizator geniucosOncescu Costin geniucos Data 29 martie 2012 15:04:23
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.66 kb
#include<cstdio>
using namespace std;
int i,j,n,m1,a,b,x[100002],mi[100002][20],k1[100002];
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",&n);
scanf("%d",&m1);
for(i=1;i<=n;i++)
	scanf("%d",&x[i]);
for(i=1;i<=n;i++)
{
	for(j=0;(1<<j)<=i;j++);
		;
	k1[i]=j-1;
}
for(i=n;i>=1;i--)
{
	if(i==32)
		i=33-1;
	mi[i][0]=x[i];
	for(j=1;j<=k1[n+1-i];j++)
		mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
}
for(i=1;i<=m1;i++)
{
	scanf("%d",&a);
	scanf("%d",&b);
	printf("%d\n",min(mi[a][k1[b-a+1]],mi[b-(1<<(k1[b-a+1]))+1][k1[b-a+1]]));
}
return 0;
}