Cod sursa(job #3338599)

Utilizator AnSeDraAndrei Sebastian Dragulescu AnSeDra Data 4 februarie 2026 11:34:51
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <cmath>

using namespace std;

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

const int Nmax = /*100005*/ 105;
const int Log2Nmax = 17;

int n, q;
int v[Nmax], rmq[Log2Nmax][Nmax];

void citire_vector(){
    fin >> n >> q;
    for(int i = 1; i <= n; i++){
        fin >> v[i];
    }
}

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

    for(int bit = 1; (1 << bit) <= n; bit++){
        for(int i = 1; i <= n - (1 << bit) + 1; i++){
            rmq[bit][i] = min(rmq[bit - 1][i], rmq[bit - 1][i + (1 << (bit - 1))]);
        }
    }
}

void citire_si_rezolvare_interogari(){
    int poz1, poz2, ordin;

    for(int i = 1; i <= q; i++){
        fin >> poz1 >> poz2;

        ordin = log2(poz2 - poz1 + 1);
        fout << min(rmq[ordin][poz1], rmq[ordin][poz2 - (1 << ordin) + 1]) << '\n';
    }
}

int main(){
    citire_vector();
    calculare_rmq();
    citire_si_rezolvare_interogari();

    return 0;
}