Cod sursa(job #852827)

Utilizator lucian666Vasilut Lucian lucian666 Data 11 ianuarie 2013 20:06:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb



//Vasilut
#include<fstream>
#define NN 100001

const char iname[]="arbint.in";
const char oname[]="arbint.out";

using namespace std;
ofstream out(oname);

int arb[ 4 * NN + 10 ] , n ,m,maxx,position,value;


void read();
void update(int nod,int left,int right);
void query(int nod,int left,int right ,int start,int finish);

int main()
{
	read();
	return 0;
}

void read()
{
	ifstream in(iname);
	
	in >> n >> m;
	for(int x,i=1;i<=n;i++)
	{
		in >> x;
		position = i;
		value = x;
		update(1,1,n);
	}
	
	for(int tip,st,dr,i=1 ;i<=m  ; i++ )
	{
		in >> tip >> st >> dr;
		
		if ( tip == 0 )
		{
			maxx = -1;
			query(1,1,n,st,dr);
			out << maxx <<'\n';
		}
		else
		
			if ( tip == 1 )
			{
				position = st;
				value = dr;
				update(1,1,n);
			}
	}
}

void update(int nod,int left,int right)
{
	if ( left == right )
	{
		arb[nod] = value;
		return;
	}
	
	int mid = (left + right ) >> 1;
	
	if ( position <= mid )
		update(  nod << 1 ,left,mid);
	else
		update( ( nod << 1 ) + 1 , mid+1,right);
	
	arb[nod] = max ( arb[ nod << 1] ,arb[ ( nod << 1 ) + 1] );
}

void query(int nod,int left,int right,int start,int finish)
{
	if ( start <= left && finish >=right )
	{
		if ( arb[nod] > maxx )
			maxx = arb[nod];
		return;
	}
	
	int mid = ( left + right ) >> 1;
	
	if ( start<= mid )
		query( nod << 1 , left, mid , start,finish );
		if ( mid < finish )
		query( ( nod << 1 ) + 1 , mid+1,right,start,finish );
}