Cod sursa(job #729714)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 29 martie 2012 20:46:27
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<fstream>
using namespace std;
const int lg=100005;

  ifstream f("arbint.in");
  ofstream g("arbint.out");

  int x,a, b,rez;
  
inline int max(int a, int b)
{
return a>b?a:b;
}

int init[lg], poz[lg],t[4*lg];


void constru(int st, int dr, int poz)
{

	if(st==dr)
	{
	 init[st]=poz;
	 return;
	}
	int x=(st+dr)/2;
	constru(st,x,2*poz);
	constru(x+1, dr, 2*poz+1);
	
}


void actualizez(int poz, int val)
{

	int x=init[poz];
	t[x]=val;
	
	x>>=1;
	while(x)
	{
	t[x]=max(t[2*x],t[2*x+1]);
	x>>=1;
	}
}

void interogare(int st, int dr, int poz)
{
		if(st>a || dr<b)
			return;
		if(a<=st && dr<=b)
			rez=max(rez, t[poz]);
		else
			if(st<dr)
			{
			int x=(st+dr)/2;
			interogare(st, x, 2*poz);
			interogare(x+1, dr, 2*poz+1);
			}
}


int main()
{
	int v,i,n,m;

f>>n>>m;
constru(1,n,1);

  for(i=1;i<=n;i++)
  {
	  f>>x;
	  actualizez(i,x);
  }
for(i=1;i<=m;i++)
{
       f>>x>>a>>b;
   if(!x)
   {
	rez=0;
	interogare(1,n,1);
	g<<rez<<"\n";

   }
else
	actualizez(a,b);
	
}
  return 0;
}