Cod sursa(job #3266492)

Utilizator Vlad_NistorNIstor Vlad Vlad_Nistor Data 8 ianuarie 2025 21:48:16
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.37 kb
#include <bits/stdc++.h>
using namespace std;

const int LIMIT = 30,
          NMAX  = 100003;

int rmq[LIMIT][NMAX], loga[NMAX];

void precalc(const int &n) {
    for(int put = 1; (1 << put) <= n; put++) {
        /// practic noi vom parcurge puterile // secventele si vom alege minimul din diagonala precedent sau urmatorul din fata
        for(int i = 1; i <= n;i++) {
            rmq[put][i] = rmq[put - 1][i];
            int nextput = i + (1 << (put - 1));
            if(nextput <= n && rmq[put-1][nextput] < rmq[put][i]) {
                rmq[put][i] = rmq[put-1][nextput];
            }
        }
    }
    // mai avem nevoie sa calculam logaritimii
    for(int i = 2; i <= n;i++) {
        loga[i] = loga[i / 2] + 1;
    }

}

int32_t getMinim(int left, int right) {
    int exp = loga[right - left + 1];
    int len = (1 << exp);
    return min(rmq[exp][left], rmq[exp][right - len + 1]);
}

int32_t main(void) {
    ofstream cout("rmq.out");
    ifstream cin("rmq.in");
    int n, Q;
    cin >> n >> Q;
    for(int i = 1;i <= n;i++) {
        /// noi oricum precalculam minimurile pe secvente puteri de 2, asadar 2 ^ 0 = 1
        cin >> rmq[0][i]; /// minimul pentru el insusi este chiar el
    }
    precalc(n);
    while(Q--) {
        int left, right;
        cin >> left >> right;
        cout << getMinim(left, right) << '\n';
    }

}