Cod sursa(job #2904623)

Utilizator DariaClemClem Daria DariaClem Data 18 mai 2022 00:17:09
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

void construireArbore(long int stanga, long int dreapta, long int index) {
    if (stanga == dreapta)
        arbore[index] = numere[stanga];
    else {
        int mij = stanga + (dreapta - stanga) / 2;
        construireArbore(stanga, mij, index << 1);
        construireArbore(mij + 1, dreapta, (index << 1) + 1);
        arbore[index] = min(arbore[index << 1],
                            arbore[(index << 1) + 1]);
    }
}

int determinareMinim(long int a, long int b, long int stanga, long int dreapta, long int index) {
    if (a <= stanga and dreapta <= b) {
        return arbore[index];
    } else {
        if (a <= dreapta and b >= stanga) {
            int mij = stanga + (dreapta - stanga) / 2;
            return min(determinareMinim(a, b, stanga, mij, index << 1),
                       determinareMinim(a, b, mij + 1, dreapta, (index << 1) + 1));
        }
    }
    return 100001;
}

int main() {
    freopen("rmq.in", "r", stdin);
    freopen("rmq.out", "w", stdout);

    long int index, operatie, a, b, stanga = 1, dreapta;
    scanf("%ld %ld", &nrNumere, &nrOperatii);
    dreapta = nrNumere;
    for (index = 1; index <= nrNumere; index += 1) {
        scanf("%ld ", &numere[index]);
    }
    construireArbore(stanga, dreapta, 1);
    for (index = 1; index <= nrOperatii; index += 1) {
        scanf("%ld %ld", &a, &b);
        printf("%ld\n", determinareMinim(a, b, stanga, dreapta, 1));
    }
    return 0;
}