Cod sursa(job #738548)

Utilizator BitOneSAlexandru BitOne Data 20 aprilie 2012 20:17:09
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.82 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N_MAX=100011;
const int LOG2N_MAX=17;

int RMQ[LOG2N_MAX][N_MAX];

inline int _min(int x, int y) {return x <= y ? x : y;}
inline int log2(int x) { return 8*sizeof(int)-__builtin_clz(x)-1; }
int main()
{
    int N, M, i, j, k, kLast, Log2, till, x, y;
    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in>>N>>M;
    for(i=1; i <= N; ++i)
        in>>RMQ[0][i];
    Log2=log2(N);
    for(j=1, k=2, kLast=1; j <= Log2; ++j, kLast=k, k<<=1)
    {
        till=N-k+1;
        for(i=1; i <= till; ++i)
            RMQ[j][i]=_min(RMQ[j-1][i], RMQ[j-1][i+kLast]);
    }
    for(; M; --M)
    {
        in>>x>>y;
        j=log2(y-x+1);
        out<<_min(RMQ[j][x], RMQ[j][y-(1<<j)+1] )<<'\n';
    }
    return EXIT_SUCCESS;
}