Cod sursa(job #936488)

Utilizator BitOneSAlexandru BitOne Data 7 aprilie 2013 13:33:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int NMAX = 262145;

int v[NMAX];

inline int max(int x, int y) {return x >= y ? x : y;}
inline void Update(int index, int left, int right, const int& pIndex, const int& pValue)
{
	if(left == right)
	{
		v[index] = pValue;
		return ;
	}
	int middle = (left + right) >> 1;
	
	if(pIndex <= middle) Update(index << 1, left, middle, pIndex, pValue);
	else Update((index << 1) | 1, middle + 1, right, pIndex, pValue);
	v[index] = max(v[index << 1], v[(index << 1) | 1]);
}

inline int Query(int index, int left, int right, const int& start, const int& end)
{
	if(left >= start && right <= end)
		return v[index];
	int m1, m2, middle;
	
	m1 = m2 = -1;
	middle = (left + right) >> 1;
	if(start <= middle) 
		m1 = Query(index << 1, left, middle, start, end);
	if(end > middle)
		m2 = Query((index << 1) | 1, middle + 1, right, start, end);
	
	return max(m1, m2);
}

int main()
{
	int N, M, i, x, a, b, op;
	ifstream in("arbint.in");
	ofstream out("arbint.out");
	
	in >> N >> M;
	for(i = 1; i <= N; ++i)
	{
		in >> x;
		Update(1, 1, N, i, x);
	}
	for(; M; --M)
	{
		in >> op >> a >> b;
		if(op) Update(1, 1, N, a, b);
		else out << Query(1, 1, N, a, b) << '\n';
	}
	
	return EXIT_SUCCESS;
}