Cod sursa(job #2626551)

Utilizator andreea.sbobAndreea Surdu-Bob andreea.sbob Data 6 iunie 2020 20:45:06
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

unsigned intArb[100000];

unsigned interogare(size_t nod, size_t st, size_t dr, size_t a, size_t b) {
    if (a <= st && dr <= b) {
        return intArb[nod];
    } else {
        size_t mij = (st + dr)/2;
        unsigned maxVal = 0;
        if(a <= mij)
            maxVal = max(maxVal, interogare(2*nod, st, mij, a, b));
        if(b > mij)
            maxVal = max(maxVal, interogare(2*nod+1, mij+1, dr, a, b));
        return maxVal;
    }
}

void actualizare(size_t nod, size_t st, size_t dr, size_t i, unsigned val) {
	if (st <= i && i <= dr) {
		if (st != dr) {
			size_t mij = (st + dr)/2;
			if(i <= mij)
				actualizare(2*nod, st, mij, i, val);
			if(i > mij)
				actualizare(2*nod+1, mij+1, dr, i, val);
            intArb[nod] = max(intArb[2*nod], intArb[2*nod+1]);
		}
		else {
			intArb[nod] = val;
		}
	}
}

int main() {

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

	size_t n, m;
	in >> n >> m;

	for (int i = 0; i < n; i++) {
		unsigned t;
		in >> t;
		actualizare(1, 0, n-1, i, t);
	}

    for (int i = 0; i < m; i++) {
        unsigned op, a, b;
        in >> op >> a >> b;
        if (op == 0) {
            out << interogare(1, 0, n-1, a-1, b-1) << '\n';
        } else if (op == 1) {
            actualizare(1, 0, n-1, a-1, b);
        }
    }
    return 0;
}