Cod sursa(job #1275246)

Utilizator fhandreiAndrei Hareza fhandrei Data 24 noiembrie 2014 22:01:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
// FMI - Grupa 135 - Semigrupa 2 - Hareza Andrei
// Include
#include <fstream>
using namespace std;

// Clase
template<class T, int SIZE> class segment_tree
{
#define leftSon (node<<1)
#define rightSon ((node<<1)+1)
private:
	T tree[SIZE<<2];
	int maxSize, currentSize;
	
public:
	
	segment_tree()
	{
		#include <cstring>
		memset(tree, 0, sizeof(tree));
		maxSize = 0;
		currentSize = 0;
	}
	
	segment_tree(int maxSize)
	{
		memset(tree, 0, sizeof(tree));
		this->maxSize = maxSize;
		currentSize = 0;
	}
	
	void setSize(int maxSize)
	{
		this->maxSize = maxSize;
	}
	
	void insert(int value)
	{
		this->update(++currentSize, value);
	}
	
	void update(int pos, int value)
	{
		this->realUpdate(1, 1, maxSize, pos, value);
	}
	
private:
	void realUpdate(int node, int left, int right, int pos, int value)
	{
		if(left == right)
		{
			tree[node] = value;
			return;
		}
		
		int mid = (left+right)>>1;
		if(pos <= mid)
			realUpdate(leftSon, left, mid, pos, value);
		else
			realUpdate(rightSon, mid+1, right, pos, value);
		
		tree[node] = max(tree[leftSon], tree[rightSon]);
	}
	
public:
	int query(int qLeft, int qRight)
	{
		return realQuery(1, 1, maxSize, qLeft, qRight);
	}
	
private:
	int realQuery(int node, int left, int right, int qLeft, int qRight)
	{
		if(qLeft <= left && right <= qRight)
			return tree[node];
		if(right < qLeft || qRight < left)
			return 0;
		
		int mid = (left+right)>>1;
		
		#define rql realQuery(leftSon, left, mid, qLeft, qRight)
		#define rqr realQuery(rightSon, mid+1, right, qLeft, qRight)
		return max(rql, rqr);
		#undef rql
		#undef rqr
	}
	
	
#undef leftSon
#undef rightSon
};


// Constante
const int sz = 100001;

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

int num, questions;

// Main
int main()
{
	in >> num >> questions;
	
	segment_tree<int, sz> tree(num);
	
	int val;
	for(int i=1 ; i<=num ; ++i)
	{
		in >> val;
		tree.insert(val);
	}
	
	int type, a, b;
	while(questions--)
	{
		in >> type >> a >> b;
		if(type)
			tree.update(a, b);
		else
			out << tree.query(a, b) << '\n';
	}
	
	in.close();
	out.close();
	return 0;
}