Cod sursa(job #2544206)

Utilizator marius004scarlat marius marius004 Data 11 februarie 2020 20:47:55
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <iostream>
#include <fstream>

std::ifstream f("rmq.in");
std::ofstream g("rmq.out");

const int NMAX = 100'005;
int n,t,rmq[20][NMAX],log[NMAX],x,y;

int main(){
    
    f >> n >> t;
    
    for(int i = 1;i <= n;++i)
        f >> rmq[0][i];
    
    //precalulez logaritm din nr de la 1 la n
    log[0] = log[1] = 0;
    for(int i = 2;i <= n;++i)
        log[i] = 1 + log[i / 2];
    
    //precalculez rmq
    for(int i = 1;i <= log[n];++i){
        
        for(int j = 1;j <= n;++j){
            
            rmq[i][j] = rmq[i - 1][j];
            
            int e = i - 1;
            int index = j + (1 << e);
            
            if(index <= n && rmq[i][j] > rmq[i - 1][index])
                rmq[i][j] = rmq[i - 1][index];
        }
    }
    
    
    while(t--){
        
        f >> x >> y;
        
        int len = y - x + 1;
        
        g << std::min(rmq[log[len]][x],rmq[log[len]][ y - (1 << log[len]) + 1]) << '\n';
    }
            
    return 0;
}