Cod sursa(job #2461087)

Utilizator rares404AlShaytan - Balasescu Rares rares404 Data 24 septembrie 2019 21:15:17
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>

FILE *in = fopen("rmq.in", "r"), *out = fopen("rmq.out", "w") ;

const int MV = 1e5 ;
const int LOG = 18 ;

int n, m ;

int rmq[LOG][MV + 5] ;
int v[MV + 5] ;
int LG[MV + 5] ;

void RMQ() {
        int i, j ;
        LG[1] = 0 ;
        for (i = 1 ; i <= n ; ++ i) {
                rmq[0][i] = v[i] ;
        }
        for (i = 2 ; i <= n ; ++ i) { LG[i] = 1 + LG[i >> 1] ; }
        for (j = 1 ; (1 << j) <= n ; ++ j) {
                for (i = 1 ; i <= n - (1 << j) + 1 ; ++ i) {
                        rmq[j][i] = std::min(rmq[j - 1][i], rmq[j - 1][i + (1 << (j - 1))]) ;
                }
        }
}

int main() {
        fscanf(in, "%d %d\n", &n, &m) ;
        for (int i = 1 ; i <= n ; ++ i) {
                fscanf(in, "%d\n", v + i) ;
        }
        RMQ() ;
        int left, right, lg, answer ;
        while (m --) {
                fscanf(in, "%d %d\n", &left, &right) ;
                lg = LG[right - left + 1] ;
                answer = std::min(rmq[lg][left], rmq[lg][right - (1 << lg) + 1]) ;
                fprintf(out, "%d\n", answer) ;
        }
}