Cod sursa(job #2902967)

Utilizator iulia.talpalariuIulia-Georgiana Talpalariu iulia.talpalariu Data 16 mai 2022 23:26:47
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

int arb[300001], n, m;

void pune_val(int nod, int st, int dr, int pozitie, int val) {
    if(st == dr) {
        arb[nod] = val;
        return;
    }
    int mijloc_interval = (st+dr) >> 1;
    if (pozitie <= mijloc_interval)
        pune_val(nod << 1, st, mijloc_interval,pozitie,val);

    else
        pune_val((nod << 1)+1, mijloc_interval+1, dr, pozitie, val);


    arb[nod] = (arb[nod << 1] < arb[(nod << 1) + 1]) ? arb[nod << 1] : arb [(nod << 1) +1];


}
int min_interval(int nod, int st, int dr, int inceput, int sfarsit) {
    if(inceput <= st && sfarsit >= dr) {
        return arb[nod];
    }
    else {
        int mijloc_interval = (st+dr) >> 1 ;
        int fiu_st = 1000000, fiu_dr= 1000000;
        if (inceput <= mijloc_interval)
            fiu_st = min_interval(nod << 1, st,mijloc_interval,inceput,sfarsit);

        if (sfarsit > mijloc_interval)
            fiu_dr = min_interval((nod << 1)+1, mijloc_interval+1, dr, inceput, sfarsit);

        return (fiu_dr < fiu_st) ? fiu_dr : fiu_st;
    }
}

int main() {
    std::fstream fileIn("rmq.in");
    std::ofstream fileOut("rmq.out");
    fileIn >> n >> m;
    int x;
    for(int i = 1; i <= n; ++i) {
        fileIn >> x;
        pune_val(1,1,n,i,x);
    }
    int a,b;
    for( int i = 0; i < m; ++i) {
        fileIn >> a >> b;
        fileOut << min_interval(1,1,n,a,b) << '\n';
    }
    return 0;
}