Cod sursa(job #2701263)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 30 ianuarie 2021 11:42:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

const int N = 100041;

int n, m;
int bn;
int tre[N*4];

void _deb(int cp=1){
	cout << tre[cp];
	if(tre[cp*2] || tre[cp*2+1]){
		cout << "{";
		bool c=false;
		if(tre[cp*2]){_deb(cp*2);c=true;}
		if(tre[cp*2+1]){if(c){cout<<" ";}_deb(cp*2+1);}
		cout << "}";
	}
}

void deb(){
	_deb();
	cout << "\n";
}

void meset(int p, int v){
	int cp = bn+p-1;
	tre[cp] = v;
	while(cp > 1){
		cp /= 2;
		tre[cp] = max(tre[cp*2], tre[cp*2+1]);
	}
}

int meget(int lt, int rt, int cp=1, int clt=1, int crt=bn){
	int mid = (clt+crt)/2;
	if(clt == lt && crt == rt){
		return tre[cp];
	}else if(lt >= clt && rt <= mid){
		return meget(lt, rt, cp*2, clt, mid);
	}else if(lt > mid && rt <= crt){
		return meget(lt, rt, cp*2+1, mid+1, crt);
	}else{
		return max(
			meget(lt, mid, cp*2, clt, mid),
			meget(mid+1, rt, cp*2+1, mid+1, crt));
	}
}

void makebn(){
	bn = 1;
	while(bn < n){
		bn *= 2;
	}
}

void meinit(){
	for(int i = bn; i < bn+n; ++i){
		fin >> tre[i];
	}
	for(int i = bn-1; i >= 1; --i){
		tre[i] = max(tre[i*2], tre[i*2+1]);
	}
}

int main(){
	// ios_base::sync_with_stdio(false);
	fin >> n >> m;
	makebn();
	meinit();
	for(int i = 0; i < m; ++i){
		int op, a, b;
		fin >> op >> a >> b;
		if(op == 0){
			fout << meget(a, b) << "\n";
		}else{
			meset(a, b);
		}
	}
	return 0;
}