Cod sursa(job #3299338)

Utilizator dAlex2003Dan Alexandru dAlex2003 Data 5 iunie 2025 14:40:54
Problema Range minimum query Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <iostream>
#include <vector>
#include <cmath>
#include <fstream>
using namespace std;

const int N = 1000005; // capacitatea lui N
const int LOG = 20; // maxima putere a lui 2 , mai mult decat suficient

int M[N][LOG]; // sparse table-ul
int log2val[N]; // log-ul in baza 2 pentru un i specific

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

void buildSparseTable(vector<int> &a){
    int n = a.size();
    for(int i =0 ; i<n ; i++){
        M[i][0] = a[i]; // minimul fiecarui index pe un interval de lungime 1 este chiar numarul de pe index
    }

    for(int j = 1; (1<<j) <= n ; j++){ // aici merge pe fiecare coloana ( putere a lui 2)
        for(int i =0 ; i+( 1<<j)<= n ; i++ ){ // aici mergem pe fiecare rand(index-urile), de notat ca index + putere sa nu iasa din size
            M[i][j] = min(M[i][j-1] , M[i +(1<<(j-1))][j-1]);
            //aici facem minimul pe 2 intervale. Primul interval -> de la index la puterea precedenta de 2
            //al doilea interval -> de la index + puterea lui 2 precedenta mergem in fata tot acceasi lungime 
            // asta asigura acoperirea totala
        }
    }
    computeLog(n);
}

int query(int L, int R){
    int k = log2val[R - L +1]; // lungimea de 2 maxima pe acel interval
    return  min(M[L][k] , M[R - (1<<k) + 1][k]);
    //minimul de la inceput pana la puterea maxima de 2
    // si de la final mergem in spate puterea lui 2 si adaugam 1
}

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


int main(){
    int vector_size , query_number , index1,index2;
    in>>vector_size>>query_number;
    vector<int> A(vector_size);
    for(int i = 0 ; i< vector_size ; i++){
        in>>A[i];
    }
    buildSparseTable(A);
    for(int i =0 ; i<query_number ; i++){
        in>>index1>>index2;
        out<<query(index1-1 , index2-1 )<<endl;
    }

}