Cod sursa(job #2903367)

Utilizator razvan1234Danciu Razvan razvan1234 Data 17 mai 2022 15:32:17
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <iostream>
#include <fstream>

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

int arb_int[4000001];
void facere(int nod, int st, int dr, int poz, int val)
{
    if (poz < st or poz > dr) return;
    if (st == dr){
        arb_int[nod] = val;
        return;
    }

    int mjl = (st + dr) / 2;
    if (poz <= mjl) facere(2*nod, st, mjl, poz, val);
    else facere(2*nod+1, mjl+1, dr, poz, val);

    arb_int[nod] = min(arb_int[2*nod], arb_int[2*nod+1]);
}

int get_min(int nod, int st, int dr, int q_st, int q_dr)
{
    if (q_st > dr or q_dr < st) return 100000000;
    if (st >= q_st and dr <= q_dr) return arb_int[nod];

    int mjl = (st + dr) / 2;
    return min(get_min(2*nod, st, mjl, q_st, q_dr), get_min(2*nod+1, mjl+1, dr, q_st, q_dr));
}

int main()
{
    int n, t;
    fin>>n>>t;

    for (int i = 1; i <= n; i++){
        int a;
        fin>>a;
        facere(1, 1, n, i, a);
    }

    for(int i = 1; i <= t; i++){
        int a, b;
        fin>>a>>b;
        fout<<get_min(1, 1, n, a, b)<<"\n";
    }
    return 0;
}