Cod sursa(job #1044933)

Utilizator mvcl3Marian Iacob mvcl3 Data 30 noiembrie 2013 17:03:57
Problema Range minimum query Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
//O(NlogN), O(1)

#include <fstream>
#define in "rmq.in"
#define out "rmq.out"
#define Max_Size 100004
#define log2_Max_Size 18

std :: ifstream f(in);
std :: ofstream g(out);

int N, M;
int log2[Max_Size], ST[Max_Size][log2_Max_Size];    //Sparse Table

inline void Read_Data()
{
    f >> N >> M;

    for(int i = 1; i <= N; ++i) f >> ST[i][0];
}

inline void Solve()
{
    for(int i = 2; i < N; ++i)  log2[i] = log2[i / 2] + 1;

    for(int j = 1; (1 << j) <= N; ++j)
        for(int i = 1; i + (1 << j) - 1 <= N; ++i)
        {
            ST[i][j] = std :: min(ST[i][j - 1], ST[i + (1 << (j - 1))][j - 1]);
        }
}

inline void RMQ()
{
    int a, b;

    for(int i = 1; i <= M; ++i)
    {
        f >> a >> b;

        int k = log2[b - a + 1];

        g << std :: min(ST[a][k], ST[b - (1 << k) + 1][k]) << '\n';
    }
}

int main()
{
    Read_Data();
    Solve();
    RMQ();

    g.close();
    return 0;
}