Cod sursa(job #3306360)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 9 august 2025 22:01:25
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.07 kb
#include <iostream>
#include <fstream>

using namespace std;

const int Nmax = 100005;

int n, m, dp[Nmax][20], v[Nmax], log2[Nmax];
// dp[i][j] = min de pe int [i, i + 2^j-1]

void RMQ(){
    for(int i = 1; i <= n; i++){
        dp[i][0] = v[i];
    }

    for(int p = 1; (1 << p) <= n; p++){
        for(int i = 1; i <= n; i++){
            dp[i][p] = dp[i][p-1];
            int j = i + (1 << (p-1));
            if(j <= n && dp[i][p] > dp[j][p-1]){
                dp[i][p] = dp[j][p-1];
            }
        }
    }
}

void preCalc(){
    log2[1] = 0;
    for(int i = 2; i <= Nmax; i++){
        log2[i] = log2[i/2] + 1;
    }
}

int main()
{
    ifstream fin("rmq.in");
    ofstream fout("rmq.out");
    fin >> n >> m;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }

    preCalc();
    RMQ();

    while(m--){
        int st, dr;
        fin >> st >> dr;
        int len = dr - st + 1;
        int p = log2[len];
        int jum = 1 << p;
        fout << min(dp[st][p], dp[dr - p][p]) << "\n";
    }

    return 0;
}