Cod sursa(job #2276830)

Utilizator DordeDorde Matei Dorde Data 5 noiembrie 2018 14:47:13
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.05 kb
#include <fstream>

using namespace std;
ifstream f ("rmq.in");
ofstream g ("rmq.out");
int const NM = 1e5;
int v [1 + NM] , rmq [1 + 17][1 + NM] , log [1 + NM];
inline void preclog (int number){
    log [1] = 0;
    for(int i = 2 ; i <= number ; ++ i)
        log [i] = 1 + log [i / 2];
    return;
}
inline void rq (int n){
    for(int i = 0 ; i <= log [n] ; ++ i){
        for(int j = 1 ; j <= n ; ++ j)
            if (! i)
                rmq [i][j] = v [j];
            else
                if (j - (1 << (i - 1)) > 0)
                    rmq [i][j] = min (rmq [i - 1][j - (1 << (i - 1))] , rmq [i - 1][j]);
    }
    return;
}
int main()
{
    int n , m;
    f >> n >> m;
    for(int i = 1 ; i <= n ; ++ i)
        f >> v [i];
    preclog (n);
    rq (n);
    for(int i = 1 ; i <= m ; ++ i){
        int a , b , l;
        f >> a >> b;
        l = log [1 + b - a];
        if (a == b)
            g << v [a];
        else
            g << min (rmq [l][a + (1 << l) - 1] , rmq [l][b]);
        g << '\n';
    }
    return 0;
}