Cod sursa(job #2701257)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 30 ianuarie 2021 11:30:03
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.42 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 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=1, int clt=1, int crt=n){
	if(clt == crt){
		tre[cp] = v;
	}else{
		int mid = (clt+crt)/2;
		if(p <= mid){
			meset(p, v, cp*2, clt, mid);
		}else{
			meset(p, v, cp*2+1, mid+1, crt);
		}
		tre[cp] = max(tre[cp*2], tre[cp*2+1]);
	}
}

int meget(int lt, int rt, int cp=1, int clt=1, int crt=n){
	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));
	}
}

int main(){
	// ios_base::sync_with_stdio(false);
	fin >> n >> m;
	for(int i = 1; i <= n; ++i){
		int a;fin >> a;
		meset(i, a);
	}
	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;
}