Cod sursa(job #408067)

Utilizator nautilusCohal Alexandru nautilus Data 2 martie 2010 20:25:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include<fstream>
#define dmax 400001
using namespace std;

long n,m,poz,val,maxim,inceput,sfarsit;
long arbore[dmax];

void query(long nod, long stanga, long dreapta)
{
 long div;
	
 if (inceput<= stanga && dreapta<=sfarsit)
	 {
	  if (maxim<arbore[nod])
		 maxim=arbore[nod];
	  
	  return ;
	 }

 div=(stanga+dreapta)/2;
 
 if (inceput<=div)
	 query(2*nod,stanga,div);
 if (div<sfarsit)
	 query(2*nod+1,div+1,dreapta);
}

void actualizare(long nod, long stanga, long dreapta)
{
 long div;
  
 if (stanga==dreapta)
	  {
	   arbore[nod]=val;
	   return ;
	  }
	
 div=(stanga+dreapta)/2;
 
 if (poz<=div)
	 actualizare(2*nod,stanga,div); else
	 actualizare(2*nod+1,div+1,dreapta);

 if (arbore[2*nod]>arbore[2*nod+1])
	 arbore[nod]=arbore[2*nod]; else
	 arbore[nod]=arbore[2*nod+1];
}

int main()
{
 long i,nr,op,a,b;

 ifstream fin("arblong.in");
 ofstream fout("arblong.out");
 
 fin>>n>>m;
 
 for (i=1; i<=n; i++)
	 {
	  fin>>nr;
	  
	  poz=i;
	  val=nr; 
	  
	  actualizare(1,1,n);
	 }
 
 for (i=1; i<=m; i++)
	 {
	  fin>>op>>a>>b;
	  
	  if (op==0) /*determinarea maximului din longervalul [a,b]*/
		  {
		   maxim=-1;
		   inceput=a;
		   sfarsit=b;
		   
		   query(1,1,n);
		   
		   fout<<maxim<<'\n';
		  } else
		  {	     /*elementul de pe pozitia a va deveni b*/
		   poz=a;
		   val=b;
		   
		   actualizare(1,1,n);
		  }
	 }	
	
 fin.close();
 fout.close();
 
 return 0;
}