Cod sursa(job #1379908)

Utilizator alex_unixPetenchea Alexandru alex_unix Data 6 martie 2015 20:18:36
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb

#include <fstream>
#include <algorithm>

const int MAX_N(100001);

int v [MAX_N], It [MAX_N << 2];
int n;

inline int Left_son (int node)
{
	return node * 2;
}

inline int Right_son (int node)
{
	return node * 2 + 1;
}

void Build (int index, int left, int right)
{
	if (left == right)
	{
		It[index] = v[left];
		return;
	}
	int mid((left + right) / 2);
	Build(Left_son(index),left,mid);
	Build(Right_son(index),mid + 1,right);
	It[index] = std::max(It[Left_son(index)],It[Right_son(index)]);
}

void Update (int index, int left, int right, int pos, int value)
{
	if (left == right)
	{
		It[index] = value;
		return;
	}
	int mid((left + right) / 2);
	if (pos <= mid)
		Update(Left_son(index),left,mid,pos,value);
	else
		Update(Right_son(index),mid + 1,right,pos,value);
	It[index] = std::max(It[Left_son(index)],It[Right_son(index)]);
}

int Query (int index, int left, int right, int ql, int qr)
{
	if (ql <= left && right <= qr)
		return It[index];
	int mid((left + right) / 2), result(0);
	if (ql <= mid)
		result = Query(Left_son(index),left,mid,ql,qr);
	if (qr > mid)
		result = std::max(result,Query(Right_son(index),mid + 1,right,ql,qr));
	return result;
}

int main (void)
{
	std::ifstream input("arbint.in");
	int m;
	input >> n >> m;
	for (int i(1) ; i <= n ; ++i)
		input >> v[i];
	Build(1,1,n);
	std::ofstream output("arbint.out");
	int code, x, y;
	while (m)
	{
		input >> code >> x >> y;
		if (code == 0)
			output << Query(1,1,n,x,y) << '\n';
		else
			Update(1,1,n,x,y);
		--m;
	}
	input.close();
	output.close();
	return 0;
}