Cod sursa(job #2899902)

Utilizator cosminnnnnnnaDuca Cosmina cosminnnnnnna Data 9 mai 2022 17:37:25
Problema Range minimum query Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <bits/stdc++.h>
using namespace std;

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

int nr_elem, nr_intervale, elemente[500001], rmq[500001];

void build_rmq(int left, int right, int node){

    if (left == right){
        rmq[node] = elemente[left];
        return;
    }

    int middle = left + (right-left)/2;

    build_rmq (left, middle, node*2);
    build_rmq (middle+1, right, node*2+1);

    rmq[node] = min(rmq[2*node], rmq[2*node+1]);
}

int query (int node, int left, int right, int left_interval, int right_interval){

    if (left_interval <= left && right <= right_interval)
        return rmq[node];

    int minim = 1000000, middle = (left + right)/2, aux = 2*node;

    if (right_interval > middle)
        minim = min(minim, query(aux+1, middle+1, right, left_interval, right_interval));

    if (left_interval <= middle)
        minim = min(minim, query(aux, left, middle, left_interval, right_interval));

    return minim;

}

void read () {

    fin >> nr_elem >> nr_intervale;

    for (int i = 1; i <= nr_elem; ++i) {
        fin >> elemente[i];
    }
}

int main() {

    read ();

    build_rmq(1, nr_elem, 1);

    for (int i = 0; i < nr_intervale; ++i) {
        int x, y;
        fin >> x >> y;
        fout << query (1, 1, nr_elem, x, y);
    }

    return 0;
}