Cod sursa(job #2466998)

Utilizator grezdeCristian Ardeleanu grezde Data 3 octombrie 2019 15:06:14
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <algorithm>

using namespace std;

int N, M;

int arbore[500004];

void update(int i, int x, int mni, int mxi, int ia) {

	if(mni>=mxi) {
		arbore[ia] = x;
		return;
	}
	
	int mid = (mni+mxi)/2;
	if(i<=mid)
		update(i, x, mni, mid, ia*2);
	else
		update(i, x, mid+1, mxi, ia*2+1);
		
	arbore[ia] = max(arbore[2*ia], arbore[2*ia+1]);
}


void update(int i, int x) {
	update(i, x, 1, N, 1);
}

int query(int a, int b, int mni, int mxi, int ia) {
	
	if(a <= mni and b >= mxi)
		return arbore[ia];
	
	int mid=(mni+mxi)/2, v1=0, v2=0;
	
	if( a <= mid)
		v1=query(a, b, mni, mid, ia*2);
		
	if(b > mid)
		v2=query(a, b, mid+1, mxi, ia*2+1);
	
	return max(v1, v2);
	
}

int query(int a, int b) {
	return query(a, b, 1, N, 1);
}

int main() {
	
	ifstream cin("arbint.in");
	ofstream cout("arbint.out");
	
	int i, p, a, b;
	cin>>N>>M;
	for(i=1; i<=N; i++) {
		cin>>p;
		update(i, p);
	}
	
	for(i=1; i<=M; i++) {
		cin>>p>>a>>b;
		if(p==0)
			cout << query(a, b)<<"\n";
		if(p==1)
			update(a, b);
	}
	
	return 0;
}