Cod sursa(job #335584)

Utilizator crisojogcristian ojog crisojog Data 30 iulie 2009 15:21:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdio.h>
#define dim 100001  
  
long n,m,start,finish,val,pos,maxim;  
long h[4*dim+66];  

long max(long a, long b)
{
	if(a<b) return b;
	return a;
}
void update(long nod, long st, long dr)
{
	long m;
	if(st==dr)
	{
		h[nod]=val;
		return;
	}
	m=(st+dr)/2;
	if(pos<=m) update(2*nod, st, m);
	else update(2*nod+1, m+1, dr);
	h[nod]=max(h[2*nod],h[2*nod+1]);
}
void query(long nod, long st, long dr)
{
	long m;
	if(start<=st && dr<=finish)
	{
		if(maxim<h[nod]) maxim=h[nod];
		return;
	}
	m=(st+dr)/2;
	if(start<=m) query(2*nod,st,m);
	if(m<finish) query(2*nod+1,m+1,dr);
}
int main()
{
	long i,x,a,b;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;++i)
	{
		scanf("%ldz",&x);
		pos=i; 
		val=x;
		update(1,1,n);
	}
	for(i=1;i<=m;++i)
	{
		scanf("%ld%ld%ld",&x,&a,&b);
		if(x==0)
		{
			maxim=-1;
			start=a; finish=b;
			query(1,1,n);
			printf("%ld\n",maxim);
		}
		else
		{
			pos=a;val=b;
			update(1,1,n);
		}
	}
	return 0;
}