Pagini recente » Cod sursa (job #2299024) | Cod sursa (job #3202087) | Cod sursa (job #1804964) | Cod sursa (job #1050949) | Cod sursa (job #2303204)
#include<stdio.h>
#include<iostream>
#include<fstream>
using namespace std;
#define MAXN 100000
#define MAXLOGN 17
int M,N;
int V[MAXN];
int MINI[MAXN][MAXLOGN];
void buildtable(){
for(int i=0;i<N;i++)
MINI[i][0]=i;
int l=0,p=1;
while(p<=N){
p*=2;
l++;
}
int min1,min2;
p=1;
for(int j=1;j<l;j++){
p*=2;
for(int i=0;i<N;i++){
min1=MINI[i][j-1];
if((i+p/2)<N){
min2=MINI[i+p/2][j-1];
if(V[min1]<V[min2])
MINI[i][j]=min1;
else
MINI[i][j]=min2;
}
else
MINI[i][j]=min1;
}
}
}
int findmin(int i,int j){
int l=0,p=1;
while((i+p-1)<=j){
l++;
p*=2;
}
int min1=MINI[i][l-1];
int min2=MINI[j-p/2+1][l-1];
if(V[min1]<V[min2])
return min1;
else
return min2;
}
int main(){
freopen("rmq.in", "r", stdin);
//freopen("rmq_test7.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &N,&M);
for(int i=0;i<N;i++)
scanf("%d", &V[i]);
buildtable();
int nbline=1;
int x,y,min;
for(int i=0;i<M;i++){
scanf("%d %d",&x,&y);
if(nbline==30563){
nbline=nbline;
}
min=findmin(x-1,y-1);
printf("%d\n",V[min]);
nbline++;
}
return 0;
}