Cod sursa(job #2897613)

Utilizator disinfoion ion disinfo Data 4 mai 2022 11:27:33
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.78 kb
#include <fstream>
#include <iostream>
#define MAX 100010
using namespace std;

int arbint[300010];
int left_n[300010];
int right_n[300010];
int v[MAX];

int max_on_range(int l, int r, int node){

	if(l == left_n[node] && r == right_n[node])
		return arbint[node];

	int mid;
	mid = (left_n[node] + right_n[node]) / 2;
	if(mid < l)
		return max_on_range(l, r, 2*node + 2);
	else if(mid + 1 > r)
		return max_on_range(l, r, 2*node + 1);
	else
		return max(max_on_range(l, mid, 2*node + 1), max_on_range(mid + 1, r, 2*node + 2));


}

void build(int node, int node_l, int node_r){
	left_n[node] = node_l;
    right_n[node] = node_r;

	if(node_r == node_l)
		arbint[node] = v[node_l];
	else{
		int mid;
		mid = (node_l + node_r) / 2;
		build(2*node + 1, node_l, mid);
		build(2*node + 2, mid + 1, node_r);
		arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
	}	
}

void update(int idx, int val, int node){

	if(left_n[node] == right_n[node]){
		arbint[node] = val;
		v[idx] = val;
		return;
	}

	int mid;
	mid = (left_n[node] + right_n[node]) / 2;


	if(mid < idx){
		update(idx, val, 2*node + 2);
		arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
	}
	else{
		update(idx, val, 2*node + 1);
		arbint[node] = max(arbint[2*node + 1], arbint[2*node + 2]);
	}


}

string repeat(string s, int n){
	if(n == 0)
		return "";
	else
		return s + repeat(s, n - 1);
}



int main(){
	ifstream fin;
	ofstream fout;
	fin.open("arbint.in");
	fout.open("arbint.out");

	int m, n, q, a, b, i;
	fin >> n >> m;
	for(i=0; i < n; ++i)
		fin >> v[i];

	build(0, 0, n - 1);
	for(i=0; i < m; ++i){
		fin >> q >> a >> b;
		if(q){
			update(a - 1, b, 0);
		}
		else{
			fout << max_on_range(a - 1, b - 1, 0) << endl;
		}
	}


}