Cod sursa(job #1956869)

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