Cod sursa(job #2786830)

Utilizator George_CristianGeorge Dan-Cristian George_Cristian Data 21 octombrie 2021 18:54:52
Problema Range minimum query Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>

using namespace std;

ifstream f("rmq.in");
ofstream g("rmq.out");

#define NMAX 100005

int n, m, arb[4 * NMAX], a[NMAX + 5];

void citire() {
    f >> n >> m;
    for (int i = 0; i < n; ++i)
        f >> a[i];
}

void initializare_arbore(int poz, int st, int dr) {
    if (st == dr) {
        arb[poz] = st;
        return;
    }
    initializare_arbore(2 * poz, st, (st + dr) / 2);
    initializare_arbore(2 * poz + 1, (st + dr) / 2 + 1, dr);
    arb[poz] = (a[arb[2 * poz]] <= a[arb[2 * poz + 1]]) ? arb[2 * poz] : arb[2 * poz + 1];
}

int query(int poz, int st, int dr, int sti, int dri) {
    if (dr < sti || dri < st)
        return -1;
    if (sti <= st && dr <= dri)
        return arb[poz];
    int poz1 = query(2 * poz, st, (st + dr) / 2, sti, dri);
    int poz2 = query(2 * poz + 1, (st + dr) / 2 + 1, dr, sti, dri);
    if (poz1 == -1)
        return poz2;
    if (poz2 == -1)
        return poz1;
    return (a[poz1] <= a[poz2]) ? poz1 : poz2;
}

void rezolvare() {
    int sti, dri;
    for (int i = 0; i < m; ++i) {
        f >> sti >> dri;
        g << a[query(1, 0, n - 1, sti - 1, dri - 1)] << '\n';
    }
}

int main() {
    citire();
    initializare_arbore(1, 0, n - 1);
    rezolvare();
    return 0;
}