Cod sursa(job #3206861)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 24 februarie 2024 12:18:22
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.79 kb
#include<fstream>

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

const int MAX = 1e5 + 5;
int E[MAX], v[MAX], dp[17][MAX], n, m;

int main(){
    fin >> n >> m;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
        dp[0][i] = v[i];
    }
    
    E[1] = 0;
    
    for(int i = 2; i < MAX; ++i)
        E[i] = 1 + E[i / 2];
        
    for(int p = 1; (1 << p) <= n; ++p)
        for(int i = 1; i <= n; ++i){
            int j = (1 << (p - 1)) + i;
            dp[p][i] = dp[p - 1][i];
            if(j <= n)
                dp[p][i] = std::min(dp[p - 1][i], dp[p - 1][j]);
        }
        
    int st, dr;
    while(m--){
        fin >> st >> dr;
        int e = E[dr - st + 1];
        int len = (1 << e);
        fout << std::min(dp[e][st], dp[e][dr - len + 1]) << '\n';
    }
}