Pagini recente » Cod sursa (job #2691351) | Cod sursa (job #2699070) | Cod sursa (job #1624392) | Cod sursa (job #523880) | Cod sursa (job #921092)
Cod sursa(job #921092)
#include <cstdio>
#include <cmath>
#define NMAX 100001
int V[NMAX],n,m;
int M[NMAX][20];
int lg[NMAX];
inline int RMQ(int i,int j){
int k = lg[j-i+1];
if(V[M[i][k]] < V[M[j-(1<<k)+1][k]])
return V[M[i][k]];
else return V[M[j-(1<<k)+1][k]];
}
int main(){
int i,j;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(register int i=1;i<=n;++i)
scanf("%d",&V[i]);
for(register int i=1;i<=n;++i)
M[i][0] = i;
for(register int j=1;(1<<j)<=n;++j)
for(register int i=1;i+(1<<j)-1<=n;++i)
if(V[M[i][j-1]] <= V[M[i+(1<<(j-1))][j-1]])
M[i][j] = M[i][j-1];
else
M[i][j] = M[i+(1<<(j-1))][j-1];
int p=1;
for(register int i=1;i<=n;++i)
if(p*2 == i) lg[i] = lg[i-1]+1, p*=2;
else lg[i] = lg[i-1];
while(m){
scanf("%d%d",&i,&j);
printf("%d\n",RMQ(i,j));
--m;
}
return 0;
}