Pagini recente » Cod sursa (job #2503617) | Cod sursa (job #140504) | Cod sursa (job #1943138) | Cod sursa (job #3160679) | Cod sursa (job #1383242)
#include<cstdio>
using namespace std;
int rmq[1000001][21];
int doi[21];
int lg[1000001];
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m,i,j,k;
scanf("%d%d",&n,&m);
doi[0]=1;
for(i=1; i<21; ++i){
doi[i]=doi[i-1]*2;
}
lg[1]=0;
for(i=2; i<=n; ++i){
lg[i]=lg[i/2] + 1;
}
for(i=0; i<n; ++i){
scanf("%d",&rmq[i][0]);
}
for(j=1; doi[j] <= n; ++j){
for(i=0; i + doi[j] - 1 < n; ++i){
if(rmq[i][j-1] <= rmq[i + doi[j-1]][j-1])
rmq[i][j] = rmq[i][j-1];
else
rmq[i][j] = rmq[i + doi[j-1]][j-1];
}
}
for(;m;--m){
scanf("%d%d",&i,&j);
i--; j--;
k = lg[j-i + 1];
if(rmq[i][k] <= rmq[j - doi[k] + 1][k])
printf("%d\n",rmq[i][k]);
else
printf("%d\n",rmq[j-doi[k]+1][k]);
}
return 0;
}