Pagini recente » Cod sursa (job #312157) | Cod sursa (job #1321006) | Cod sursa (job #615693) | Cod sursa (job #2637412) | Cod sursa (job #943093)
Cod sursa(job #943093)
#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;
}