Cod sursa(job #2983081)

Utilizator serbanducanDucan Andrei Serban serbanducan Data 21 februarie 2023 16:31:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int n, m;
int V[100005];
int arb[200005];

void build(int nod, int st, int dr);
void change(int nod, int st, int dr, int poz, int nr);
int max_interval(int nod, int st, int dr, int l, int r);

int main() {

	fin >> n >> m;
	for (int i = 1; i <= n; i++) {
		fin >> V[i];
	}

	build(1, 1, n);

	for (int i = 0; i < m; i++) {
		int c;
		fin >> c;
		
		if (c == 0) {

			int l, r;
			fin >> l >> r;

			fout << max_interval(1, 1, n, l, r) << '\n';

		}
		else if (c == 1) {

			int poz, nr;
			fin >> poz >> nr;

			change(1, 1, n, poz, nr);

		}
	}

	return 0;

}

void build(int nod, int st, int dr) {

	if (st == dr) {
		arb[nod] = V[st];
		return;
	}

	int mj = (st + dr) / 2;
	build(nod * 2, st, mj);
	build(nod * 2 + 1, mj + 1, dr);

	arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);

}

void change(int nod, int st, int dr, int poz, int nr) {

	if (st == dr) {
		arb[nod] = nr;
		return;
	}

	int mj = (st + dr) / 2;

	if(poz <= mj)
		change(nod * 2, st, mj, poz, nr);
	else
		change(nod * 2 + 1, mj + 1, dr, poz, nr);

	arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);

}

int max_interval(int nod, int st, int dr, int l, int r) {

	if (l <= st && dr <= r)
		return arb[nod];

	int mj = (st + dr) / 2;
	
	int max1 = 0;
	if (mj >= l)
		max1 = max(max1, max_interval(nod * 2, st, mj, l, r));
	if(mj + 1 <= r)
		max1 = max(max1, max_interval(nod * 2 + 1, mj + 1, dr, l, r));

	return max1;


}