Cod sursa(job #166280)

Utilizator mike4problemsRadu Gabriel mike4problems Data 27 martie 2008 19:49:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.83 kb
#include<fstream>
using namespace std;

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

#define MAX 100000

int a[5*MAX],n,m,val,start,end,poz,k,mAx;

#define Max(a,b) ((a)>(b)?(a):(b))

void modi(int,int,int);
void find(int,int,int);

int main()
{
	fin>>n>>m;
	for(k=1;k<=n;k++)
	{
		poz=k;
		fin>>val;
		modi(1,1,n);
	}
	while(m--)
	{
		fin>>k;
		if(k)
		{
			fin>>poz>>val;
			modi(1,1,n);
			continue;
		}
		fin>>start>>end;
		mAx=0;
		find(1,1,n);
		fout<<mAx<<'\n';
	}
	return 0;
}

void modi(int k,int i,int j)
{
	if(i==j) 
	{
		a[k]=val;
		return;
	}
	int mij=(i+j)/2;
	if(poz<=mij) modi(2*k,i,mij);
	else modi(2*k+1,mij+1,j);
	a[k]=Max(a[2*k],a[2*k+1]);
}

void find(int k,int i,int j)
{
	if(start<=i&&j<=end)
	{
		mAx=Max(mAx,a[k]);
		return;
	}
	int mij=(i+j)/2;
	if(start<=mij) find(2*k,i,mij);
	if(mij<end) find(2*k+1,mij+1,j);
}