Pagini recente » Cod sursa (job #972544) | Cod sursa (job #1830618) | Cod sursa (job #3243387) | Cod sursa (job #1576232) | Cod sursa (job #2904450)
#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, 2 * index); //parcurg subarborele stang
construireArbore(mij + 1, dreapta, 2 * index + 1); //parcurg subarborele drept
arbore[index] = min(arbore[index * 2],
arbore[index * 2 + 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, 2 * index),
determinareMinim(a, b, mij + 1, dreapta, 2 * index + 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;
}