Cod sursa(job #3125961)

Utilizator AlexandruIoan20Moraru Ioan Alexandru AlexandruIoan20 Data 4 mai 2023 21:48:38
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#define lSon(x) (2 * x)
#define rSon(x) (2 * x + 1) 
using namespace std;

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

int A[100005], N, M, aint[200025], answer; 

void Gen(int nod, int left, int right) {
	if (left == right) {
		aint[nod] = A[left]; 
		return; 
	}

	int mid = (left + right) / 2; 
	Gen(lSon(nod), left, mid); 
	Gen(rSon(nod), mid + 1, right); 

	aint[nod] = max(aint[lSon(nod)], aint[rSon(nod)]); 
}

void Update(int nod, int left, int right, const int &poz, const int &val) {
	if (left == right) {
		aint[nod] = val; 
		A[poz] = val; 
		return; 
	}

	int mid = (left + right) / 2;
	if (poz <= mid)
		Update(lSon(nod), left, mid, poz, val); 
	if (poz > mid)
		Update(rSon(nod), mid + 1, right, poz, val); 

	aint[nod] = max(aint[lSon(nod)], aint[rSon(nod)]);
}	

void Query(int nod, int left, int right, const int &lQuery, const int &rQuery) {
	if (lQuery <= left && right <= rQuery) {
		answer = max(answer, aint[nod]); 
		return; 
	}

	int mid = (left + right) / 2; 

	if (lQuery <= mid)
		Query(lSon(nod), left, mid, lQuery, rQuery); 
	if (rQuery > mid)
		Query(rSon(nod), mid + 1, right, lQuery, rQuery); 

}

int main()
{
	fin >> N >> M; 
	for (int i = 1; i <= N; i++)
		fin >> A[i]; 

	Gen(1, 1, N); 
	for (int i = 1; i <= M; i++)
	{
		int q; 
		fin >> q; 
		int a, b; 
		fin >> a >> b;
		if (q == 0) {
			Query(1, 1, N, a, b);
			fout << answer << '\n'; 
			answer = 0; 
		}
		
		else 
			Update(1, 1, N, a, b); 
		
	}
	return 0; 
}