Cod sursa(job #3146435)

Utilizator TheAndreiEnache Andrei Alexandru TheAndrei Data 21 august 2023 01:20:07
Problema Range minimum query Scor 70
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 mini=inf;
    int i;
    for(i=0;i<n;i++){
        mini = mini < v[i]? mini: v[i];
        if((i+1)%sq==0){
            batog[i/sq]=mini;
            mini=inf;
        }
    }
    batog[i/sq]=mini;
}

int main(){
    std::ios::sync_with_stdio(false);
    int m, x, y, idx=-1, el_min;
    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--;
        el_min = inf;

        while(x<=y) {
            if(x % sq == 0 && x + sq <= y){
                do {
                        el_min=el_min < batog[x / sq] ? el_min: batog[x/sq];
                        x += sq;
                } while (x + sq <= y);
            }
            else {
                el_min=el_min < v[x] ? el_min: v[x];
                x++;
            }
        }
        fout<<el_min<<"\n";
    }
}