Cod sursa(job #3306358)

Utilizator razvanmrt_06Mariuta Razvan razvanmrt_06 Data 9 august 2025 21:44:55
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.11 kb
#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 i = 1; i <= n; i++){
        for(int j = 1; j <= log2[n]; j++){
            if(i + (1 << j) - 1 <= n){

            dp[i][j] = min(dp[i][j-1], dp[i + (1 << (j-1))][j-1]);
            }
        }
    }
}

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

int query(int x, int y){
    if(x == y){
        return x;
    }
    if(x > y){
        swap(x, y);
    }
    int len = y - x ;
    int p = log2[len];
    int minim = min(dp[x][p], dp[y - p][p]);
    return minim;
}

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 x, y;
        fin >> x >> y;
        fout << query(x, y) << "\n";
    }

    return 0;
}