Cod sursa(job #2041910)

Utilizator Spiromanii_MessiUNIBUCThrowTerror Spiromanii_Messi Data 17 octombrie 2017 21:13:57
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <bits/stdc++.h>

using namespace std ;

const int MAX = 1e5 + 14 ;

int aint [MAX] ; 

void update (int nod, int st, int dr, int pos, int val) {
	if (st == dr) {
		aint [nod] = val ; 
		return ; 
	}
	int mij = (st + dr) >> 1 ;
	if (pos <= mij) {
		update (nod * 2, st, mij, pos, val) ; 
	}
	else {
		update (nod * 2 + 1, mij + 1, dr, pos, val) ; 
	}
	aint [nod] = max (aint [nod * 2], aint [nod * 2 + 1]) ;
}

int Q (int nod, int st, int dr, int a, int b) {
	if (a <= st and dr <= b) return aint [nod] ;

	int l = 0, r = 0 ;
	int mij = (st + dr) >> 1 ; 
	if (a <= mij) l = Q (nod * 2, st, mij, a, b) ; 
	if (b > mij) r = Q (nod * 2 + 1, mij + 1, dr, a, b) ; 
	return max (l, r) ;
}

int main(int argc, char const *argv[])
{
	freopen ("arbint.in", "r", stdin) ;
	freopen ("arbint.out", "w", stdout) ; 
	int n, m ; 
	cin >> n >> m ; 
	for (int i = 1 ; i <= n ; ++ i) {
		int x ; 
		cin >> x ; 
		update (1, 1, n, i, x) ; 
	}
	while (m --) {
		int t ; 
		cin >> t ; 
		if (t) {
			int pos, val ; 
			cin >> pos >> val ;
			update (1, 1, n, pos, val) ; 
		}
		else {
			int a, b ;
			cin >> a >> b ;
			cout << Q (1, 1, n, a, b) << '\n' ; 
		}
	}
	return 0;
}