Pagini recente » Profil stefanz | Statistici cocis andreea (orhidee) | Diferente pentru tema intre reviziile 39 si 158 | Monitorul de evaluare | Cod sursa (job #221036)
Cod sursa(job #221036)
#include <cstdio>
#include <vector>
using namespace std;
class rmq{
private:
int n,i;
vector< vector <int> > arb;
int logar(int x){
int i;
for (i=0;(1<<i)<=x;++i);
if (i>0)--i;
return i;
}
public:
void build(vector<int> param,int (*comparator)(int a,int b)){
int i,j,log;
n=param.size()-1;
arb.resize(n+2);
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=logar(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));
}
}