Cod sursa(job #2886452)

Utilizator Redstoneboss2Fabian Lucian Redstoneboss2 Data 7 aprilie 2022 19:35:52
Problema Range minimum query Scor 20
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.04 kb
#include <bits/stdc++.h>

using namespace std;

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

int n, m;
vector<vector<int>> t(17);

int putere(int baza, int exp);
void gentabel();
int MRQ(int l, int r);

int main(){

    fin >> n >> m;

    for(int i = 0, p; i < n; i++){
        p = putere(2, i);

        if(n - p + 1 > 0){
            t[i].resize(n - p + 1);
        }

        fin >> t[0][i];
    }

    gentabel();

    for(int i = 0, l, r; i < m; i++){
        fin >> l >> r;
        fout << MRQ(l-1, r-1) << '\n';
    }

    return 0;
}

int putere(int baza, int exp){
    int p = 1;

    for(int i = 0; i < exp; i++){
        p *= baza;
    }

    return p;
}

void gentabel(){
    for(int i = 1; i < 17; i++){
        for(int j = 0; j < t[i].size(); j++){
            t[i][j] = min(t[i-1][j], t[i-1][j + putere(2, i-1)]);
        }
    }
}

int MRQ(int l, int r){
    int p = floor(log2(r-l+1)), k, mini;

    k = putere(2, p);
    mini = min(t[p][l], t[p][r-k+1]);

    return mini;
}