Cod sursa(job #2903383)

Utilizator razvan1234Danciu Razvan razvan1234 Data 17 mai 2022 15:44:13
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 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 100001;
    if (st >= q_st and dr <= q_dr) return arb_int[nod];

    int mjl = (st + dr) / 2;
    int part1 = 100001, part2 = 100001;
    if (q_st <= mjl) part1 = get_min(2*nod, st, mjl, q_st, q_dr);
    if (mjl+1 <= q_dr) part2 = get_min(2*nod+1, mjl+1, dr, q_st, q_dr);

    return min(part1,part2);
}

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