Cod sursa(job #723725)

Utilizator gabriel93Robu Gabriel gabriel93 Data 25 martie 2012 19:46:50
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<stdio.h>
using namespace std;
int n,m;
int a[18][100002];
int lg[100002];

void citire()
{
	int i;
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;++i)
		scanf("%d",&a[0][i]);
}

void rezolv()
{
	int k,i,j,x,y;
	
	for(j=1;(1<<j) <= n;++j)
		for(i=1;i+(1<<j)-1<=n;++i)
		{
			x=a[j-1][i];
			y=a[j-1][i+(1<<(j-1))];
			if(x<y)
				a[j][i]=x;
			else
				a[j][i]=y;
		}
	lg[1]=0;
	for(i=2;i<=n;++i)
		lg[i]=lg[i/2]+1;
}

void scrie()
{
	int i,x,y,k,r1,r2;
	for(i=1;i<=m;++i)
	{
		scanf("%d %d",&x,&y);
		k=lg[y-x+1];
		r1=a[k][x];
		r2=a[k][y-(1<<k)+1];
		if(r1<=r2)
			printf("%d\n",r1);
		else
			printf("%d\n",r2);
	}
}
 
int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	citire();
	rezolv();
	scrie();
	fclose(stdin);
	fclose(stdout);
	return 0;
}