Cod sursa(job #2905024)

Utilizator crivoicarlaCrivoi Carla crivoicarla Data 19 mai 2022 06:55:16
Problema Range minimum query Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <bits/stdc++.h>
#include <algorithm>

using namespace std;
#define MAX 100001
ifstream fin("rmq.in");
ofstream fout("rmq.out");

int nr[MAX], arbore[4*MAX], n, nrOp;

void construireArbore(int r, int l, int pivot) {
    if (r == l)
        arbore[pivot] = nr[r];
    else {
        int mij = r + (l - r) / 2;
        construireArbore(r, mij, pivot << 1);
        construireArbore(mij + 1, l, (pivot << 1) + 1);
        arbore[pivot] = min(arbore[pivot << 1],
                            arbore[(pivot << 1) + 1]);
    }
}

int determinareMinim(int a, int b, int r, int l, int pivot) {
    if (a <= r and l <= b) {
        return arbore[pivot];
    } else {
        if (a <= l and b >= r) {
            int mij = r + (l - r) / 2;
            return min(determinareMinim(a, b, r, mij, pivot << 1),
                       determinareMinim(a, b, mij + 1, l, (pivot << 1) + 1));
        }
    }
    return MAX;
}

int main() {
    int pivot, operatie, a, b, r = 1, l;
    fin >> n>> nrOp;
    l = n;
    for (pivot = 1; pivot <= n; pivot += 1) {
        fin >> nr[pivot];
    }
    construireArbore(r, l, 1);
    for (pivot = 1; pivot <= nrOp; pivot += 1) {
        fin >> a >> b;
        fout << determinareMinim(a, b, r, l, 1) << "\n";
    }
    return 0;
}