Cod sursa(job #3144770)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 10 august 2023 16:12:25
Problema Range minimum query Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.17 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;
    for(int i=0;i<k;i++){
        batog[i]=inf;
    }
    for(int i=0;i<n;i++){
      int j=i/sq;
      batog[j]=std::min(batog[j], v[i]);
    }
}

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";
    }
}