Cod sursa(job #943093)

Utilizator iarbaCrestez Paul iarba Data 24 aprilie 2013 11:38:55
Problema Range minimum query Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1 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]);}
	for(i=n;i<=n*2;i++){a[0][i]=999999999;}
	t=2;
	for(i=1;i<=40;i++){for(j=0;j<=n-1/t;j++){
			a[i][j]=min(a[i-1][j*t],a[i-1][j*t+1]);
											}
					  }
	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 ",afismin);
									 }
return 0;
}