Pagini recente » Cod sursa (job #1846298) | Cod sursa (job #290459) | Cod sursa (job #2927489) | Cod sursa (job #35657) | Cod sursa (job #3152010)
#include<fstream>
#include<iostream>
#include<cmath>
using namespace std;
ifstream in("rmq.in");
ofstream out("rmq.out");
#define nmax 100000
#define logNMAX 17
int v[nmax];
int rmq[logNMAX][nmax];
int lg2[nmax];
int p2[logNMAX];
int main(){
int n,m;
in>>n>>m;
for(int i=0;i<n;i++){
in>>v[i];
}
//log2
lg2[0]=-1;
int k=1;
for(int i=1;i<=n;i++){
if(i==k){
lg2[i]=lg2[i-1]+1;
k<<=1;
}else{
lg2[i]=lg2[i-1];
}
}
//p2
k=1;
for(int i=0;k<=n;i++){
p2[i]=k;
k<<=1;
}
//rmq
for(int i=0;i<n;i++){
rmq[0][i]=v[i];
}
k=1;
for(int i=1;k<=n;i++){
for(int j=0;j<n;j++){
if(j+k<n){
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+k]);
}else{
rmq[i][j]=rmq[i-1][j];
}
}
k<<=1;
}
int x,y;
for(int i=0;i<m;i++){
in>>x>>y;
x-=1;
y-=1;
int part=lg2[y-x+1];
out<<min(rmq[part][x],rmq[part][y-p2[part]+1])<<"\n";
}
}