Cod sursa(job #744464)

Utilizator lucian666Vasilut Lucian lucian666 Data 8 mai 2012 19:26:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb


#include<fstream>
#define dim 100001

using namespace std;
ofstream out("arbint.out");

int Arb[4*dim+66],n,m,start,finish,val,poz,maxx;

void up(int nod,int a ,int b);
void query(int nod,int a,int b);

int main()
{
	ifstream in("arbint.in");
	in>>n>>m;
	int x;
	for(int i=1;i<=n;i++)
	{
		in>>x;
		val=x;
		poz=i;
		up(1,1,n);
	}
	int a,b,X;
	for(int i=1;i<=m;i++)
	{
			in>>X>>a>>b;
			if(X==0)
			{
				maxx=-1;
				start=a;
				finish=b;
				query(1,1,n);
				out<<maxx<<'\n';
			}
			else
			{
				poz=a,val=b;
				up(1,1,n);
			}
	}
	
	return 0;
}

void up(int nod,int left,int right)
{
	if(left==right)
	{
		Arb[nod]=val;
		return ;
	}
	int mid=(left+right)/2;
		if(poz<=mid)
			up(2*nod,left,mid);
		else
			up(2*nod+1,mid+1,right);
		Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}
void query(int nod,int left,int right)
{
	if(start<=left&&finish>=right)
	{
		if(Arb[nod]>maxx)
			maxx=Arb[nod];
		return ;
	}
	int mid=(left+right)/2;
	if(start<=mid)
		query(2*nod,left,mid);
	if(mid<finish)
		query(2*nod+1,mid+1,left);
}