Cod sursa(job #3146386)

Utilizator andreea_chivuAndreea Chivu andreea_chivu Data 20 august 2023 19:09:18
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>

using namespace std;

const int NMAX = 100001;
const int LOGMAX = 17;

int a[NMAX];
int tabel[NMAX][LOGMAX];
int lg2[NMAX];

void precalc(int n){
    lg2[1] = 0;
    for(int i = 2; i <= n; i++){
        lg2[i] = lg2[i/2]+1;
    }
}

void build(int n){
    for(int i = 0; i < n; i++){
        tabel[i][0] = a[i];
    }

    for(int p = 1; p <= LOGMAX; p++){
        for(int i = 0; i + (1 << p) - 1 < n; i++){
            tabel[i][p] = min(tabel[i][p-1], tabel[i + (1 << (p-1))][p-1]);
        }
    }
}

int query(int left, int right){
    int len, log;

    len = right - left + 1;
    log = lg2[len];

    return min(tabel[left][log], tabel[right - (1 << log) + 1][log]);
}

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

    int n, m;
    fin >> n >> m;

    for(int i = 0; i < n; i++){
        fin >> a[i];
    }

    precalc(n);
    build(n);

    for(int i = 0; i < m; i++){
        int a, b;
        fin >> a >> b;
        fout << query(a-1, b-1) << "\n";
    }


    fin.close();
    fout.close();
    return 0;
}