Cod sursa(job #2758244)

Utilizator Alex_AlionteAlionte Alexandru Alex_Alionte Data 9 iunie 2021 10:41:54
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.92 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin ( "rmq.in" );
ofstream fout ( "rmq.out" );

int lg [ 100005 ], n, m, a [ 100005 ], v [ 18 ] [ 100005 ], x, y;

static inline void logaritm ( ) {
    lg [ 1 ] = 0;
    for ( int i = 2; i <= 18; ++ i ) {
        lg [ i ] = lg [ i / 2 ] + 1;
    }
}

int main() {
    fin >> n >> m;
    for ( int i = 1; i <= n; ++ i ) {
        fin >> a [ i ];
    }
    logaritm();
    for ( int i = 1; i <= n; ++ i ) {
        v [ 0 ] [ i ] = a [ i ];
    }
    int l = lg [ n ];
    for ( int i = 1; i <= l; ++ i ) {
        for ( int j = 1; j <= n; ++ j ) {
            v [ i ] [ j ] = min ( v [ i - 1 ] [ j ], v [ i - 1 ] [ j + ( 1 << ( i - 1 ) ) ] );
        }
    }
    for ( int i = 1; i <= m; ++ i ) {
        fin >> x >> y;
        int k = lg [ y - x ];
        fout << min ( v [ k ] [ x ], v [ k ] [ y - ( 1 << k ) + 1 ] ) << '\n';
    }
    return 0;
}