Cod sursa(job #2701252)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 30 ianuarie 2021 11:20:39
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 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];

int nodecount(int a){
	return a*2-1;
}

int shusta(int a){
	int r = 1;
	while(r*2+1 < a){
		r = r*2+1;
	}
	return r;
}

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

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 >= clt && 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;
	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;
}