Cod sursa(job #943096)

Utilizator iarbaCrestez Paul iarba Data 24 aprilie 2013 11:50:49
Problema Range minimum query Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>
using namespace std;
long inceput,sfarsit,afismin,t,a[101][1000001],sf,aux,nivel,test,intrebari,n,i,j;
long min(long x,long y){if(x<y){return x;}else{return y;}}

int main()
{
	freopen("rmq.in","r",stdin);
	freopen("rmq.out","w",stdout);
	scanf("%ld",&n);
	scanf("%ld",&intrebari);
	for(i=0;i<=n-1;i++){scanf("%ld",&a[0][i]);}
	t=0;aux=n;while(aux){aux/=2;t++;}t--;
	aux=1<<t;
	for(i=n;i<=aux;i++){a[0][i]=999999999;}
	aux=t;t=2;
	for(i=1;i<=aux;i++){for(j=0;j<=n-1/t;j++){
			a[i][j]=min(a[i-1][j*2],a[i-1][j*2+1]);
											}t*=2;
					  }
	for(test=1;test<=intrebari;test++){
		scanf("%ld%ld",&inceput,&sfarsit);
		inceput--;sfarsit--;
		if(inceput>sfarsit){aux=inceput;inceput=sfarsit;sfarsit=aux;}
		afismin=999999999;
		while(inceput<=sfarsit){
		sf=inceput;aux=inceput;
		t=1;nivel=-1;
		do{
			sf+=t/2;
			if(aux%2==1){aux=-1;}else{;aux/=2;}
			t*=2;nivel++;
		  }while((aux!=-1)&&(sf+t/2<sfarsit));
		afismin=min(afismin,a[nivel][inceput/(t/2)]);
		inceput=sf+1;
									 }
		printf("%ld\n",afismin);
									 }
return 0;
}