Cod sursa(job #2884596)

Utilizator lolismekAlex Jerpelea lolismek Data 4 aprilie 2022 11:45:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 1e5;
int aint[4 * N + 1], ans;

int left_son(int nod){
	return 2 * nod;
}

int right_son(int nod){
	return 2 * nod + 1;
}

void update(int nod, int st, int dr, int poz, int val){
	if(st == dr){
		aint[nod] = val;
		return;
	}

	int mij = (st + dr) / 2;
	if(poz <= mij)
		update(left_son(nod), st, mij, poz, val);
	else
		update(right_son(nod), mij + 1, dr, poz, val);
	aint[nod] = max(aint[left_son(nod)], aint[right_son(nod)]);
}

void query(int nod, int st, int dr, int Qst, int Qdr){
	if(Qst <= st && dr <= Qdr){
		ans=  max(ans, aint[nod]);
		return;
	}

	int mij = (st + dr) / 2;
	if(Qst <= mij)
		query(left_son(nod), st, mij, Qst, Qdr);
	if(mij + 1 <= Qdr)
		query(right_son(nod), mij + 1, dr, Qst, Qdr);
}

int main(){
	int n, q;
	fin >> n >> q;

	for(int i = 1; i <= n; i++){
		int x;
		fin >> x;
		update(1, 1, n, i, x);
	}

	while(q--){
		int cerinta, a, b;
		fin >> cerinta >> a >> b;

		if(cerinta == 0){
			ans = -1;
			query(1, 1, n, a, b);
			fout << ans << '\n';
		}else{
			update(1, 1, n, a, b);
		}
	}

	return 0;
}