Cod sursa(job #221042)

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