Cod sursa(job #386804)

Utilizator cameleonGeorgescu Dan cameleon Data 26 ianuarie 2010 04:10:54
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include<stdio.h>
#define Nmax 100001
int arb[2*Nmax],n,m,op,a,b,max;
void update(int nod,int s,int d,int inf,int poz)
{
	if(s==d)
	{
		arb[nod]=inf;
		return;
	}
	
	int mij=(s+d)/2;
	
	if(poz<=mij)
		update(2*nod,s,mij,inf,poz);
	else
		update(2*nod+1,mij+1,d,inf,poz);
	
	if(arb[2*nod]>=arb[2*nod+1])
		arb[nod]=arb[2*nod];
	else
		arb[nod]=arb[2*nod+1];
}

void query(int nod,int s,int d, int a, int b)
{
	if(a<=s && d<=b)
		{
			if(max<arb[nod])max=arb[nod];
			return ;
	}
	int mij=(s+d)/2;
	if(a<=mij)query(2*nod,s,mij,a,b);
	if(mij<b)query(2*nod+1,mij+1,d,a,b);
	
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i,x;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		update(1,1,n,x,i);
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&op,&a,&b);
		if(op)
			update(1,1,n,b,a);
		else
			{
				max=-1;
				query(1,1,n,a,b);
				printf("%d\n",max);
		}
	}
	return 0;
}