Cod sursa(job #2606698)

Utilizator michael_blazemihai mihai michael_blaze Data 28 aprilie 2020 11:54:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>
#include <cmath>

#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005

using namespace std;

int arr[MAX], n, m;
int arbore[4 * MAX + 1];
int a, b;
int Maxim;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
// inline int max_intervals(int left, int right, int son) {
// 	if (left == right) {
// 		arbore[son] = arr[left];
// 		return arr[left];
// 	}
// 	int mid = (left + right) / 2;

// 	arbore[son] = max(max_intervals(left, mid, 2 * son), 
// 		max_intervals(mid + 1, right, 2 * son + 1));
// }

inline void update(int left, int right, int son) {
	if (left == right) {
		arbore[son] = b;
		arr[left] = b;
		return; 
	}
	int mid = (left + right) / 2;
	if (a <= mid)
		update(left, mid, 2 * son);
	else
		update(mid + 1, right, 2 * son + 1);
	arbore[son] = max(arbore[2 * son], arbore[2 * son + 1]);
}

inline void getMax(int left, int right, int son) {
	if (left >= a and right <= b)
		Maxim = max(Maxim, arbore[son]);
	else {
		int mid = (left + right) / 2;
		int Max = -1;
		if (a <= mid)
			getMax(left, mid, 2 * son);
		if (b >= mid + 1)
		 	getMax(mid + 1, right, 2 * son + 1);
	}
}
int main() {
	int x;
	fin >> n >> m;
	
	for (int i = 1;i <= n;i ++) {
		fin >> x;
		a = i;
		b = x;
		update(1, n, 1);
	}


	int operation;
	for (int i = 1;i <= m;i ++) {
		fin >> operation >> a >> b;
		if (operation) 
			update(1, n, 1);
		else {
			Maxim = -1;
			getMax(1, n, 1);
			fout << Maxim << '\n';
		}
	}

	return 0;
}