Cod sursa(job #2818874)

Utilizator lolismekAlex Jerpelea lolismek Data 17 decembrie 2021 10:05:27
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 1e5 + 1;
int arbore[4 * N + 1], val, poz, st, dr, maxim;

void update(int nod, int left, int right) {
	if (left == right) {
		arbore[nod] = val;
		return;
	}
	int mij = (left + right) / 2;
	if (poz <= mij) update(2 * nod, left, mij);
	else update(2 * nod + 1, mij + 1, right);
	arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);
}

void query(int nod, int left, int right) {
	if (st <= left && right <= dr) {
		if (maxim < arbore[nod]) maxim = arbore[nod];
		return;
	}
	int mij = (left + right) / 2;
	if (st <= mij) query(2 * nod, left, mij);
	if (mij < dr) query(2 * nod + 1, mij + 1, right);
}

int main() {
	int n, m;
	fin >> n >> m;
	for (int i = 1; i <= n; i++) {
		int x;
		fin >> x;
		poz = i, val = x;
		update(1, 1, n);
	}
	for (int i = 1; i <= m; i++) {
		int cerr, a, b;
		fin >> cerr >> a >> b;
		if (cerr == 0) {
			maxim = -1;
			st = a, dr = b;
			query(1, 1, n);
			fout << maxim << "\n";
		} else {
			poz = a, val = b;
			update(1, 1, n);
		}
	}
	return 0;
}