Cod sursa(job #714962)

Utilizator fhandreiAndrei Hareza fhandrei Data 16 martie 2012 13:18:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
//Include
#include <fstream>
#include <algorithm>
#include <utility>
using namespace std;

//Definitii
#define leftSon 2*node
#define rightSon 2*node + 1

#define left first
#define right second

//Constante
const int MAX_SIZE = (int)1e5;

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

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

int nrElemente, nrOperatii;
int val, poz, maxim;
int operatie;
int tree[4*MAX_SIZE+1];

pair<int, int> interval;

//Main
int main()
{
	in >> nrElemente >> nrOperatii;
	for(poz=1 ; poz<=nrElemente ; ++poz)
	{
		in >> val;
		update(1, 1, nrElemente);
	}
	
	for(int i=1 ; i<=nrOperatii ; ++i)
	{
		in >> operatie;
		if(operatie)
		{
			in >> poz >> val;
			update(1, 1, nrElemente);
		}
		else
		{
			in >> interval.left >> interval.right;
			maxim = 0;
			query(1,1,nrElemente);
			out << maxim << "\n";
		}
		
	}
	
	
	in.close();
	out.close();
	return 0;
}

void update(int node,int left,int right)
{
	if(left == right)
		tree[node] = val;
	else
	{
		int mid = (left + right) / 2;
		if(mid >= poz)
			update(leftSon, left, mid);
		else
			update(rightSon, mid+1, right);
		
		tree[node] = max(tree[rightSon], tree[leftSon]);
	}
}


void query(int node, int left, int right)
{
	if(interval.left <= left && interval.right >= right)
		maxim = max(maxim, tree[node]);
	else
	{
		int mid = (left + right) / 2;
		if(interval.left <= mid)
			query(leftSon, left, mid);
		
		if(interval.right > mid)
			query(rightSon, mid+1, right);
	}
}