Cod sursa(job #3144797)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 10 august 2023 18:24:52
Problema Range minimum query Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 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 mini=inf;
    for(int i=0;i<n;i++){
        mini = mini < v[i]? mini: v[i];
        if((i+1)%sq==0){
            batog[i/sq]=mini;
            mini=inf;
        }
        else if(i==n-1)
            batog[i/sq]=mini;
    }
}

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;
        x--;y--;
        int firstInterval = (x + sq - 1) / sq * sq;
        int lastInterval = y / sq * sq;
        int el_min=inf;
        while(x<y&&x<firstInterval) {
          el_min=el_min < v[x] ? el_min: v[x];
          x++;
        }
        while(y>=x&&y>=lastInterval) {
          el_min=el_min < v[y]? el_min: v[y];
          y--;
        }

        firstInterval/=sq;
        lastInterval/=sq;

        while(firstInterval<=lastInterval) {
            el_min=el_min < batog[firstInterval] ? el_min: batog[firstInterval];
            firstInterval++;
        }
        fout<<el_min<<"\n";
    }
}