Cod sursa(job #2559747)

Utilizator recapitulareOJIScarlat Marius Stefan recapitulareOJI Data 27 februarie 2020 16:18:53
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <fstream>

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

int n,t,rmq[20][100005],log[100005],x,y;

int main(){
    
    f >> n >> t;
    
    for(int i = 1;i <= n;++i)
        f >> rmq[0][i];
    
    for(int i = 2;i <= n;++i)
        log[i] = 1 + log[i / 2];
    
    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;
            
            if(j + (1 << e) <= n && rmq[i - 1][j + (1 << e)] < rmq[i][j])
                rmq[i][j] = rmq[i - 1][j + (1 << e)];
        }
    }
    
    /*
    for(int i = 0;i <= log[n];++i,g << '\n')
        for(int j = 1;j <= n;++j)
            g << rmq[i][j];
    */
    
    while(t--){
        
        f >> x >> y;
        
        int l = y - x + 1;
        int e = log[l];
        
        g << std::min(rmq[log[l]][x],rmq[log[l]][y - (1 << e) + 1]) << '\n';
    }
    
    return 0;
}