Cod sursa(job #563800)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 26 martie 2011 01:01:23
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 0.68 kb
# include <stdio.h>
using namespace std;
int a[100005][20],lg[100005],x,y,d,q,n,m,i,j,k;
int main ()
{
	freopen ("rmq.in","r",stdin);
	freopen ("rmq.out","w",stdout);
	scanf ("%i%i",&n,&m);
	for (i=1;i<=n;i++)
		scanf ("%i",&a[i][0]);
	
	for (i=2;i<=n;i++)
		lg[i]=lg[i/2]+1;
	
	for (j=1;j<=lg[n];j++)
		for (i=1;i<=n && i+(1<<j-1)<=n;i++)
		{
			k=i+(1<<j-1);
			
			if (a[i][j-1]<a[k][j-1])
				a[i][j]=a[i][j-1];
			else
				a[i][j]=a[k][j-1];
		}
		
		for (i=1;i<=m;i++)
		{
			scanf ("%i%i",&x,&y);
			d=y-x+1;
			q=lg[d];
			if (a[x][q]<a[(y-(1<<q))+1][q])
				printf ("%i\n",a[x][q]);
			else
				printf ("%i\n",a[(y-(1<<q))+1][q]);
		}
		
		return 0;
}