Cod sursa(job #751251)

Utilizator BitOneSAlexandru BitOne Data 25 mai 2012 00:01:00
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.84 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N_MAX=100011;
const int LOGN_MAX=18;

int RMQ[LOGN_MAX][N_MAX];
inline int _min(int x, int y) {return x <= y ? x : y;}
inline int log2(int x) {return 8*sizeof(int) - 1 - __builtin_clz(x);}
int main()
{
    int N, M, i, j, till, x, y, log2N, pow, pow2;
    ifstream in("rmq.in");
    ofstream out("rmq.out");

    in>>N>>M;
    for(i=1; i <= N; ++i)
        in>>RMQ[0][i];
    log2N=log2(N);
    for(i=1, pow2=2, pow=1; i <= log2N; ++i, pow=pow2, pow2<<=1)
    {
        till=N-pow2+1;
        for(j=1; j <= till; ++j)
            RMQ[i][j]=_min(RMQ[i-1][j], RMQ[i-1][j+pow]);
    }
    for(; M; --M)
    {
        in>>x>>y;
        log2N=log2(y-x+1);
        out<<_min(RMQ[log2N][x], RMQ[log2N][y-(1<<log2N)+1])<<"\n";
    }

    return EXIT_SUCCESS;
}