Cod sursa(job #221036)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 14 noiembrie 2008 10:15:06
Problema Range minimum query Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#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));
    }
}