Cod sursa(job #1454374)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 26 iunie 2015 12:42:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include <fstream>
#include <iostream>
#include <vector>
#include <utility>
using namespace std;

class aint{
	const int n;
	vector<int> v;
public:
	aint(const vector<int>& in_v):
		n(in_v.size()),
		v(2*n){
		copy(begin(in_v), end(in_v), begin(v)+n);
		for(int i = n-1; i > 0; --i){
			v[i] = max(v[2*i], v[2*i+1]); } }
	int query(int a, int b){
		int rez = 0;
		a+=n;
		b+=n;
		while(a<b){
			if(a&1){
				rez = max(rez, v[a++]); }
			if(b&1){
				rez = max(rez, v[--b]); }
			a /= 2;
			b /= 2; }
		return rez; }
	void update(int poz, const int new_val){
		poz += n;
		v[poz] = new_val;
		for(int i = poz; i > 1; i /= 2){
			v[i/2] = max(v[i], v[i^1]); } } };

int main(){
	ifstream f("arbint.in");
	ofstream g("arbint.out");
	int n, m;
	f >> n >> m;
	vector<int> v(n);
	for(auto& x : v){
		f >> x; }
	aint ai(v);
	for(int i = 0, t, a, b; i < m; ++i){
		f >> t >> a >> b;
		if(t == 0){
			g << ai.query(a-1, b) << '\n'; }
		else{
			ai.update(a-1, b); } }
	return 0; }