Pagini recente » Cod sursa (job #1870131) | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #1004744) | Cod sursa (job #221043)
Cod sursa(job #221043)
#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;
inline int cmp(int a,int b){
return min(a,b);
}
rmq arb;
main(){
int i,n,a,b,m,poz,val;
int tmp[5];
char s[15];
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\n",&a);
v.push_back(a);
}
arb.build(v,cmp);
while (m--){
//scanf("%d%d",&a,&b);
gets(s);poz=0;val=0;
for (i=0;s[i];++i)
if (s[i]==' '){
tmp[++poz]=val;
val=0;
}
else
val=val*10+s[i]-'0';
tmp[++poz]=val;
printf("%d\n",arb.query(tmp[1],tmp[2],cmp));
}
}