Cod sursa(job #918232)

Utilizator taigi100Cazacu Robert taigi100 Data 18 martie 2013 18:30:18
Problema Range minimum query Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>

#define max 200010
#define inf 2000000
int arb[max],v[max],nrn,nro;

void InitArb(int node,int left,int right)
{
	if( left==right )
		arb[node]=v[left];
	else
	{
	InitArb(2*node,left,(left+right)/2);
	InitArb(2*node+1,(left+right)/2+1,right);

	if( arb[2*node] <= arb[2*node+1] )
		arb[node]=arb[2*node];
	else
		arb[node]=arb[2*node+1];
	}
}


int Question(int node, int left, int right, int a, int b)
{
	int st=inf,dr=inf;
	if( a<= left && right<=b )
		return arb[node];
	else
	{
		if( a<= ((left+right)/2) )
			st=Question( 2*node, left, (left+right)/2, a,b);
		if( b > ((left+right)/2) )
			dr=Question( 2*node+1, (left+right)/2+1, right, a, b);
	}
	return ( st<dr ) ? st:dr;
}

void Solve()
{
     InitArb(1,1,nrn);
	 
	 int x,a;
	 for(int i=1; i<=nro; i++)
	 {
		 scanf("%d %d",&x,&a);
			 printf("%d\n",Question(1,1,nrn,x,a));
	 }
}
void Read_Data()
{
	scanf("%d %d",&nrn,&nro);
	for(int i=1;i<=nrn;i++)
		scanf("%d",&v[i]);
}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);

	Read_Data();
	Solve();
	//Print_Resault();

	return 0;
}