Cod sursa(job #2904466)

Utilizator DariaClemClem Daria DariaClem Data 17 mai 2022 23:41:35
Problema Range minimum query Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <bits/stdc++.h>

using namespace std;

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

int numere[100001], arbore[400004], nrNumere, nrOperatii;

int mijloc(int stanga, int dreapta) {
    return stanga + (dreapta - stanga) / 2;
}

//Construiesc arborele de intervale
void construireArbore(int stanga, int dreapta, int index) {
    if (stanga == dreapta)  //daca am ajuns pe o "frunza" in vectorul arbore memorez elementul din vectorul de numere
        arbore[index] = numere[stanga];
    else {
        int mij = mijloc(stanga, dreapta);
        construireArbore(stanga, mij, index << 1);   //parcurg subarborele stang
        construireArbore(mij + 1, dreapta, (index << 1) + 1);  //parcurg subarborele drept
        arbore[index] = min(arbore[index << 1],
                            arbore[(index << 1) + 1]);  //pentru nodul curent memorez minimul dintre fiii sai
    }
}

//Determin elementul minim din intervalul dat
int determinareMinim(int a, int b, int stanga, int dreapta, int index) {
    //daca intervalul curent este continut de intervalul pentru care cautam valoarea minima returnez valoarea nodului
    if (a <= stanga and dreapta <= b) {
        return arbore[index];
    } else {
        //daca intervalele se intersecteaza are rost sa caut minimul
        if (a <= dreapta and b >= stanga) {
            int mij = mijloc(stanga, dreapta);
            return min(determinareMinim(a, b, stanga, mij, index << 1),
                       determinareMinim(a, b, mij + 1, dreapta, (index << 1) + 1));
        }
    }
    return 100001;
}

int main() {
    int index, operatie, a, b, stanga = 1, dreapta;
    fin >> nrNumere >> nrOperatii;
    dreapta = nrNumere;
    for (index = 1; index <= nrNumere; index += 1) {
        fin >> numere[index];
    }
    construireArbore(stanga, dreapta, 1);
    for (index = 1; index <= nrOperatii; index += 1) {
        fin >> a >> b;
        fout << determinareMinim(a, b, stanga, dreapta, 1) << "\n";
    }
    return 0;
}