Cod sursa(job #1875277)

Utilizator xtreme77Patrick Sava xtreme77 Data 10 februarie 2017 22:06:52
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>

using namespace std ;

ifstream cin ("arbint.in") ;
ofstream cout ("arbint.out") ;


class SegmentTree{
	public :
	SegmentTree (int nn)
	{
		n = nn ;
		aint.resize(nn*4) ;
	}
	void Update (int pos, int val) 
	{
		update (1, 1, n, pos, val) ;
	}
	int Solution (int a, int b)
	{
		return query(1, 1, n, a, b) ;
	}
	private :
	vector <int> aint ;
	int n ;
	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 << 1, st, mij, pos, val) ;
		}
		else {
			update (nod << 1|1, mij + 1, dr, pos, val) ;
		}
		aint [nod] = max(aint [nod << 1], aint[nod<<1|1]);
	}
	int query (int nod, int st, int dr, int a, int b)
	{
		if (a <= st and dr <= b) {
			return aint [nod] ; 
		}
		int maxim = 0 ; 
		int mij = (st + dr) >> 1 ;
		if (a <= mij) {
			maxim = max (maxim , query(nod << 1, st, mij, a, b)) ;
		}
		if (b > mij) {
			maxim = max (maxim , query(nod << 1 |1, mij + 1, dr, a, b)) ;
 		}
 		return maxim ;
	}
};

int main()
{
	int n, m ;
	cin >> n >> m ;
	SegmentTree *A = new SegmentTree(n) ;
	for (int i = 1; i <= n; ++ i) {
		int x ; 
		cin >> x ;
		A -> Update (i, x) ;
	}
	while ( m -- ) {
		int tip ;
		cin >> tip ;
		if (tip == 1) {
			int a, b ;
			cin >> a >> b ;
			A -> Update (a, b) ;
		}
		else {
			int a, b ;
			cin >> a >> b ;
			cout << A -> Solution (a, b) << '\n' ;
		}
	}
	return 0;
}