Cod sursa(job #754385)

Utilizator alexandru92alexandru alexandru92 Data 1 iunie 2012 21:56:54
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N_MAX=100011;
const int LOGN_MAX=17;

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, log2N, len, pow2, x, y;
    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=1; i <= log2N; ++i, pow2<<=1)
    {
        till=N-(pow2<<1)+1;
        for(j=1; j <= till; ++j)
            RMQ[i][j]=_min(RMQ[i-1][j], RMQ[i-1][j+pow2]);
    }
    for(; M; --M)
    {
        in>>x>>y;
        len=log2(y-x+1);
        out<<_min(RMQ[len][x], RMQ[len][y - (1<<len) + 1])<<"\n";
    }

    return EXIT_SUCCESS;
}