Pagini recente » Cod sursa (job #877435) | Cod sursa (job #715800) | Cod sursa (job #688971) | Cod sursa (job #2669800) | Cod sursa (job #3337992)
#include <fstream>
#define NM 100001
using namespace std;
ifstream cin("rmq.in");
ofstream cout("rmq.out");
int E[NM],a[NM],rmin[17][NM];
int n,q,st,dr;
void loge(){
//E[i]=exponentul celei mai mari
//puteri de 2 mai mica sau egala cu i
E[1]=0;
for(int i=2;i<=n;i++)
E[i]=1+E[i/2];
}
void rminq(){
//a[putere][ind]= secventa de lungime din a[] 2 la putere care incepe la ind
for(int i=1;i<=n;i++)
rmin[0][i]=a[i];
for(int p=1;(1<<p)<=n;p++){
for(int i=1;i<=n;i++){
int j=i+(1<<(p-1));
if(j<=n)
rmin[p][i]=min(rmin[p-1][j],rmin[p-1][i]);
}
}
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;i++)
cin>>a[i];
loge();
rminq();
for(int k=1;k<=q;k++){
cin>>st>>dr;
int putere=E[dr-st+1];
int lung=(1<<putere);
cout<<min(rmin[putere][st],rmin[putere][dr-lung+1])<<"\n";
}
}