Cod sursa(job #3144776)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 10 august 2023 16:54:32
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.19 kb
#include <iostream>
#include <fstream>
#include <math.h>

#define inf 2147483647

using namespace std;

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

int v[100001], batog[317], batog_size, n, sq;

void build_batog(){
    int k=n/sq, mini=inf;
    for(int i=0;i<n;i++){
        mini = mini < v[i]? mini: v[i];
        if(i%sq==0){
            batog[i/sq]=mini;
            mini=inf;
        }
    }

}

int query(int left, int right){
     int sq=n;
    int firstInterval = (left + sq - 1) / sq * sq;
    int lastInterval = right / sq * sq;
    int el_min=inf;
    while(left<right&&left<firstInterval)
      el_min=std::min(el_min, v[left++]);
    while(right>=left&&right>=lastInterval)
      el_min=std::min(el_min, v[right--]);

    firstInterval/=sq;
    lastInterval/=sq;

    while(firstInterval<=lastInterval)
      el_min=std::min(el_min, batog[firstInterval++]);

    return el_min;
}

int main(){
    int m, x, y, idx=-1;
    fin>>n>>m;

    sq=sqrt(n);
    batog_size=(n+sq-1)/sq;
    for(int i=0;i<n;i++){
        fin>>v[i];
    }

    build_batog();

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