Cod sursa(job #201283)

Utilizator AndreyPAndrei Poenaru AndreyP Data 30 iulie 2008 10:53:26
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.64 kb
#include<stdio.h>
#include<algorithm>
using namespace std;
#define L 20
#define N 100005
int n,m,x,y;
int a[L][N];
int lg[N];
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,j,aux,aux1;
	for(i=1; i<=n; i++)
		scanf("%d",&a[0][i]);

	for(i=2; i<=n; i++)
		lg[i]=lg[i>>1]+1;
	
	for(i=1; i<=lg[n]; i++)
	{
		aux=n-(1<<i)+1;
		aux1=1<<(i-1);
		for(j=1; j<=aux; j++)
			a[i][j]=min(a[i-1][j],a[i-1][j+aux1]);
	}
	int log,dif;
	for(i=0; i<m; i++)
	{
		scanf("%d%d",&x,&y);
		dif=y-x+1;
		log=lg[dif];
		printf("%d\n",min(a[log][x],a[log][x+dif-(1<<log)]));
	}
	return 0;
}