Cod sursa(job #178891)

Utilizator znakeuJurba Andrei znakeu Data 15 aprilie 2008 12:50:49
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include <stdio.h>
#define MAXN 100100
#define MAXM 1000100

struct question
{
	int x,y;
};

int a[MAXN][20];
int v[MAXN];
int n,m;
int p2[20];
int log[MAXN];
question VM[MAXM];


void citire()
{
	int i;
	
	scanf("%d%d",&n,&m);
	
	for (i=0; i<n; ++i)
		scanf("%d",&v[i]);
	
	for (i=0; i<m; i++)
	{
		scanf("%d%d",&VM[i].x,&VM[i].y);
		VM[i].x--;
		VM[i].y--;
	}
}


inline int minim(int a, int b)
{
	if (a>b)
		return b;
	return a;	
}


void makea()
{
	int i,j;
	for (i=1,p2[0]=1; i<20; i++)
		p2[i]=p2[i-1]<<1;
	
	for (i=0; i<n; i++)
		a[i][0]=v[i];
	
	for (i=n-1; i>=0; i--)
		for (j=1; i+p2[j]<=n; j++)
			a[i][j]=minim(a[i][j-1],a[i+p2[j-1]][j-1]);
}


void makelog()
{
	int i,j;
	log[0]=0;
	for (i=1,j=0; i<n; i++)
		if (p2[j+1]>i)
			log[i]=j;
		else
			log[i]=++j;	
}


void rezolva()
{
	int i,l,r;
	
	for (i=0; i<m; i++)
	{
		l=log[VM[i].y-VM[i].x+1];
		r=minim(a[VM[i].x][l],a[VM[i].y-p2[l]+1][l]);
		printf("%d\n",r);
	}
}


int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	
	citire();
	makea();
	makelog();
	rezolva();	
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}