Cod sursa(job #3310508)

Utilizator ViAlexVisan Alexandru ViAlex Data 14 septembrie 2025 14:37:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;

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

int n,m;
vector<int> values;
vector<int> tree;

void read(){
	in>>n>>m;
	values.resize(n+1);
	tree.resize(4*n+4);

	for(int i=1; i<=n;i++){
		in>>values[i];
	}
}

void build_tree(int node, int l, int r) {
	if (l == r) {
		tree[node] = values[l];
		return;
	}

	int m = (l+r)/2;
	build_tree(node*2, l, m);
	build_tree(node*2+1, m+1, r);
	tree[node] = max(tree[node*2], tree[node*2+1]);
}

int query(int node, int l, int r, int ql, int qr) {
	if (l >= ql && r <= qr) {
		return tree[node];
	}
	int m = (l+r)/2;
	int result = -1;

	if (ql <= m) {
		result=max(result, query(node*2, l, m, ql, qr));
	}

	if (qr > m) {
		result = max(result, query(node*2+1, m+1, r, ql, qr));
	}

	return result;
}

void update(int node, int l, int r, int index, int value) {
	if(l == r) {
		tree[node] = value;
		return;
	}

	int m = (l+r)/2;
	if (index<=m) {
		update(node*2, l, m, index, value);
	} else{
		update(node*2+1, m+1, r, index, value);
	}
	tree[node] = max(tree[node*2], tree[node*2+1]);
}

int main(){
	read();
	build_tree(1, 1, n);
	int q, a, b;

	while(m--){
		in>>q>>a>>b;
		if (q==0) {
			out<<query(1, 1, n, a, b)<<'\n';
		} else {
			update(1, 1, n,a, b);
		}
	}
	return 0;
}