Pagini recente » Cod sursa (job #2901746) | Cod sursa (job #1281878) | Cod sursa (job #666075) | Cod sursa (job #388319) | Cod sursa (job #943096)
Cod sursa(job #943096)
#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;
}