Cod sursa(job #2626601)

Utilizator andreea.sbobAndreea Surdu-Bob andreea.sbob Data 7 iunie 2020 01:37:51
Problema Range minimum query Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <climits>

using namespace std;

#define NMAX 100001

int aint[NMAX*3];
int N, M, rm;

void actualizare(int nod, int st, int dr, int poz, int val)
{
    if (st == dr) {
        aint[nod] = val;
	} else {
		int mij = (st+dr)/2;

		if (poz <= mij)
            actualizare(nod*2, st, mij, poz, val);
        else
            actualizare(nod*2+1, mij+1, dr, poz, val);
		aint[nod] = min(aint[nod*2], aint[nod*2+1]);
	}
}

void interogare(int nod, int st, int dr, int a, int b) {
	if (a <= st && dr <= b) {
        rm = min(rm, aint[nod]);
    } else {
		int mij = (st+dr)/2;
		if (a <= mij)
            interogare(nod*2, st, mij, a, b);
		if (b > mij)
            interogare(nod*2+1, mij+1, dr, a, b);
    }
}

int main() {

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

	int x, y, i;
	in >> N >> M;

	for (i = 1; i <= N; i++) {
        in >> x;
		actualizare(1, 1, N, i, x);
    }

	for (i = 1; i <= M; i++) {
        in >> x >> y;

		rm = INT_MAX;
		interogare(1, 1, N, x, y);
		out << rm << '\n';
    }
	return 0;
}