Pagini recente » Cod sursa (job #1382500) | Cod sursa (job #1145283) | Cod sursa (job #1622316) | Cod sursa (job #2888249) | Cod sursa (job #221039)
Cod sursa(job #221039)
#include <cstdio>
#include <vector>
using namespace std;
class rmq{
private:
int n,i;
vector< vector <int> > arb;
vector<int> logx;
void logar(){
int i,x=1,y=0;
for (i=1;i<=n;++i){
if (i<(x<<1))
logx[i]=y;
else{
x<<=1;
logx[i]=++y;
}
}
}
public:
void build(vector<int> param,int (*comparator)(int a,int b)){
int i,j,log;
n=param.size()-1;
arb.resize(n+2);
logx.resize(n+2);
logar();
for (log=0;(1<<log)<=n;++log);
for (i=1;i<=n;++i){
arb[i].resize(log+2,0);
arb[i][0]=param[i];
}
for (i=n;i;--i)
for (j=1;i+(1<<j)<=n+1;++j)
arb[i][j]=comparator(arb[i][j-1],arb[i+(1<<(j-1))][j-1]);
}
int query(int a,int b,int (*comparator)(int a,int b)){
int log;
log=logx[b-a+1];
return comparator(arb[a][log],arb[b-(1<<log)+1][log]);
}
};
vector<int> v;
int cmp(int a,int b){
return min(a,b);
}
rmq arb;
main(){
int i,n,a,b,m;
v.push_back(0);
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for (i=1;i<=n;++i){
scanf("%d",&a);
v.push_back(a);
}
arb.build(v,cmp);
while (m--){
scanf("%d%d",&a,&b);
printf("%d\n",arb.query(a,b,cmp));
}
}