Cod sursa(job #3142137)

Utilizator not_anduAndu Scheusan not_andu Data 19 iulie 2023 14:46:25
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
/*

    d[i][j] - minimul din secventa de lungime
              2^i care incepe pe pozitia j

*/

#include <bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

#define VMAX 100003
#define LOGMAX 17

int n, queries;
int v[VMAX], d[LOGMAX + 1][VMAX], lg[VMAX];

void init(){

    lg[1] = 0;

    for(int j = 1; j <= n; ++j){

        d[0][j] = v[j];

        if(j != 1){
            lg[j] = lg[j / 2] + 1;
        }

    }

    for(int i = 1; i <= lg[n]; ++i){

        for(int j = 1; j + (1 << i) - 1 <= n; ++j){

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

        }
    }

}

int query(int stanga, int dreapta){

    int min_1, min_2;
    int aux = lg[dreapta - stanga + 1];

    min_1 = d[aux][stanga];
    min_2 = d[aux][dreapta - (1 << aux) + 1];

    return min(min_1, min_2);

}

void solve(){

    cin >> n >> queries;

    for(int i = 1; i <= n; ++i){
        cin >> v[i];
    }

    init();

    int stanga, dreapta;

    for(int i = 0; i < queries; ++i){

        cin >> stanga >> dreapta;

        cout << query(stanga, dreapta) << '\n';
    }

}

int main(){
    
    ios_base::sync_with_stdio(false);

    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    cin.tie(nullptr);
    cout.tie(nullptr);

    solve();

    return 0;
}