Cod sursa(job #2571750)

Utilizator dragomir_ioanDragomir Ioan dragomir_ioan Data 5 martie 2020 09:55:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <algorithm>
#include <fstream>

int n, aint[200000];

void build() {
	for(int i=n-1; i>=1; i--) {
		aint[i] = std::max(aint[2*i], aint[2*i+1]);
	}
}

void insert(int pos, int val) {
	for(aint[pos += n] = val; pos>1; pos >>= 1) {
		aint[pos>>1] = std::max(aint[pos], aint[pos^1]);
	}
}

int query(int left, int right) {
	int result = -1;
	for(left+=n, right+=n; left<right; left>>=1, right>>=1) {
		if(left&1) result = std::max(result, aint[left++]);
		if(right&1) result = std::max(result, aint[--right]);
	}
	return result;
}

int main() {
	std::ifstream fin ("arbint.in");
	int m;
	fin >> n >> m;
	for(int i=0; i<n; i++) fin >> aint[n+i];

	build();

	std::ofstream fout ("arbint.out");
	while(m--) {
		int op, a, b;
		fin >> op >> a >> b;
		if(op == 0) {
			fout << query(a-1, b) << "\n";
		}
		if(op == 1) {
			insert(a-1, b);
		}
	}

	fin.close();
	fout.close();

	return 0;
}