Pagini recente » Cod sursa (job #631771) | Cod sursa (job #2613279) | Cod sursa (job #2062653) | Cod sursa (job #1887251) | Cod sursa (job #164481)
Cod sursa(job #164481)
//Range minimum query
#include <cstdio>
#define min(a,b) (a<b?a:b)
const int nmax=100001;
const int lmax=16;
int a[nmax];
int log[nmax]; //log[x]=[log2(x)] (parte intreaga din logaritm in baza 2 din x :D
int m[lmax][nmax];//m[i][j]=min(a[j],a[j+1],..a[j+2^i-1]
int n,i,j,k,t;
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&n,&t);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
log[1]=0;
for (i=2;i<=n;i++) log[i]=log[i/2]+1;
for (i=1;i<=n;i++) m[0][i]=a[i];
for(i=1;(1<<i)<=n;i++)
for (j=1;j<=n-(1<<i)+1;j++)
m[i][j]=min(m[i-1][j],m[i-1][j+(1<<(i-1))]);
while (t--){
scanf("%d %d",&i,&j);
k=log[j-i+1];
printf("%d\n",min(m[k][i],m[k][j-(1<<k)+1]));
}
return 0;
}