Cod sursa(job #990570)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 28 august 2013 17:34:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
//O(NlogN+M) Sparse Table (ideea de pe topcoder)
#include <fstream>
#include <vector>
using std::vector;

inline unsigned min(unsigned a, unsigned b){ return a<b?a:b; }

class RMQ{
    private:
        vector< vector<unsigned> > ST;
    public:
        RMQ(unsigned n, std::istream &in){
            unsigned logn=0,temp=n;
            while(temp>>=1) ++logn;
            ST.resize(logn+1,vector<unsigned>(n));

            for(unsigned i=0;i<n;++i) in>>ST[0][i];

            for(unsigned j=1;j<=logn;++j)
                for(unsigned i=0;i+(1<<j)-1<n;++i)
                    ST[j][i]=min(ST[j-1][i],ST[j-1][i+(1<<(j-1))]);
        }
        unsigned getrmval(unsigned x, unsigned y){
            unsigned size=y-x+1,k=0;
            while(size>>=1) ++k;
            return min(ST[k][x],ST[k][y-(1<<k)+1]);
        }
};

int main(){
    std::ifstream fin("rmq.in");
    std::ofstream fout("rmq.out");

    unsigned n,m;
    fin>>n>>m;

    RMQ sir(n,fin);

    while(m--){
        unsigned x,y;
        fin>>x>>y;
        fout<<sir.getrmval(x-1,y-1)<<'\n';
    }
}