Cod sursa(job #1956855)

Utilizator virtualityBbbbbbbbbbbbbbbbbb virtuality Data 7 aprilie 2017 09:08:15
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<bits/stdc++.h>
using namespace std;
int arb[400069];
int n, val, pos, maxim, start, finish;
void update(int nod, int st, int dr){
	if(st==dr){
		arb[nod]=val;
		return;
	}
	int m=(st+dr)/2;
	if(pos <= m) update(2*nod, st, m); else update(2*nod+1, m+1, dr);
	arb[nod]=max(arb[nod*2], arb[nod*2+1]);
}
void query(int nod, int st, int dr){
	if(start <= st && finish >= dr){
		if(maxim < arb[nod]) maxim=arb[nod];
		return;
	}
	int m=(st+dr)/2;
	if(start<=m) query(2*nod, st, m);
	if(m < finish) query(2*nod+1, m+1, dr);
}
int main(){
	int m;
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		pos=i; 
		val=x;
		update(1, 1, n);
	}
	int x, y, k;
	while(m--){
		cin>>k>>x>>y;
		if(k==0){
			maxim=-1;
			start=x;
			finish=y;
			query(1, 1, n);
			cout<<maxim<<'\n';
		}else{
			pos=x;
			val=y;
			update(1, 1, n);
		}
	}
	return 0;
}