Cod sursa(job #663190)

Utilizator feelshiftFeelshift feelshift Data 17 ianuarie 2012 23:02:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
// http://infoarena.ro/problema/arbint
#include <fstream>
using namespace std;

#define leftSon 2 * node
#define rightSon 2 * node + 1
#define begin first
#define end second

const int MAXSIZE = 100001;

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

int length,operations;
int targetPosition,value,maxim;
pair<int,int> interval;
int tree[4*MAXSIZE];

void update(int node,int left,int right);
void query(int node,int left,int right);

int main()
{
	in >> length >> operations;
	for(targetPosition=1;targetPosition<=length;targetPosition++)
	{
		in >> value;
		update(1,1,length);
	}

	bool type = false;
	for(int i=1;i<=operations;i++)
	{
		in >> type;

		if(type)
		{
			in >> targetPosition >> value;
			update(1,1,length);
		}
		else
		{
			in >> interval.begin >> interval.end;
			maxim = 0;	// reset;
			query(1,1,length);
			out << maxim << "\n";
		}
	}

	in.close();
	out.close();

	return (0);
}

void update(int node,int left, int right)
{
	if(left == right)
	{
		tree[node] = value;
		return;
	}
	else
	{
		int middle = (left + right) / 2;

		if(targetPosition <= middle)
			update(leftSon,left,middle);
		else
			update(rightSon,middle+1,right);
	}

	tree[node] = max(tree[leftSon],tree[rightSon]);
}

void query(int node,int left, int right)
{
	if(interval.begin <= left && right <= interval.end)
		maxim = max(maxim,tree[node]);
	else
	{
		int middle = (left + right) / 2;

		if(interval.begin <= middle)
			query(leftSon,left,middle);
		
		if(interval.end > middle)
			query(rightSon,middle+1,right);
	}
}