Cod sursa(job #2752841)

Utilizator dascalu_maraDascalu Mara Elena dascalu_mara Data 19 mai 2021 19:28:46
Problema Range minimum query Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
//
//  main.cpp
//  Range minimum query
//
//  Created by Mara Dascalu on 19/05/2021.
//

#include <iostream>
#include <fstream>

using namespace std;

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

const int n_max = 100000;
int n,m, intervSt, intervDr, val, arbint[n_max*4+1], val_max;

void build(int nod, int valSt, int valDr, int poz, int val){
    if (valSt == valDr)
    {
        arbint[nod] = val;
        return;
    }
    int mij = (valSt + valDr) / 2;
    if (poz <= mij)
        build(2*nod, valSt, mij, poz, val);
    else build(2*nod+1, mij + 1, valDr, poz, val);
    
    arbint[nod] = min(arbint[2*nod], arbint[2*nod+1]);
}

void query (int nod, int valSt, int valDr, int limitaSt, int limitaDr, int& minim){
    if (limitaSt <= valSt && valDr <= limitaDr){
        if (minim >= arbint[nod]) minim = arbint[nod];
        return;
    }
        int mij = (valSt + valDr) / 2;
        if (limitaSt <= mij)
            query(2*nod, valSt, mij, limitaSt, limitaDr, minim);
        if (mij < limitaDr)
            query(2*nod+1, mij+1, valDr, limitaSt, limitaDr, minim);
    
}

int main(int argc, const char * argv[]) {
    input>>n>>m;
    for (int i = 1; i <= n; i++)
    {
        input>>val;
        if (val > val_max) val_max = val;
        build(1,1,n,i,val);
    }
    for (int i = 1; i <= m; i++)
    {
        input>>intervSt>>intervDr;
        int min = val_max;
        query(1,1,n,intervSt,intervDr, min);
        output<<min<<"\n";
    }
    
}