Cod sursa(job #183194)

Utilizator paulDeac Adrian paul Data 21 aprilie 2008 20:23:47
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<stdio.h>

#define in "arbint.in"
#define out "arbint.out"

long maxim(long a,long b){return a>b?a:b;}
void update(int,int,int,int,int);
void query(int,int,int,int,int);

long max[100001],Max;

int main()
{
	freopen(in,"r",stdin);
	freopen(out,"w",stdout);
	long n,m,a,b,i,tip,val;
	scanf("%ld%ld",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%ld",&val);
		update(1,1,n,val,i);
	}
	for(i=1;i<=m;i++)
	{
		scanf("%ld%ld%ld",&tip,&a,&b);
		if(tip==0)
		{
			Max=0;
			query(1,1,n,a,b);
			printf("%ld\n",Max);
		}
		else
			update(1,1,n,b,a);
	}
	return 0;
}
void update(int nod,int st,int dr,int val,int poz)
{
	if(st==dr)
	{
		max[nod]=val;
		return;
	}
	int mijloc=(st+dr)/2;
	if(poz<=mijloc)
		update(2*nod,st,mijloc,val,poz);
	else
		update(2*nod+1,mijloc+1,dr,val,poz);
	max[nod]=maxim(max[2*nod],max[2*nod+1]);
}
void query(int nod,int st,int dr,int a,int b)
{
	if(a<=st && dr<=b)
	{
		if(max[nod]>Max)
			Max=max[nod];
		return;
	}
	int mijloc=(st+dr)/2;
	if(a<=mijloc)
		query(2*nod,st,mijloc,a,b);
	if(b>mijloc)
		query(2*nod+1,mijloc+1,dr,a,b);
}