Cod sursa(job #416916)

Utilizator mottyMatei-Dan Epure motty Data 13 martie 2010 17:58:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<stdio.h>
#define mij(a,b) (a+b)/2
#define max(a,b) (a>b?a:b)
#define N 100001
#define NN 280001
#define INF 1000000000
int n,m,poz[N],arb[NN],y,z;

void ini(int st,int dr,int i)
{
	int h=mij(st,dr);
	if(st==dr)
	{
		poz[st]=i;
		arb[i]=-INF;
		return;
	}
	ini(st,h,i*2);
	ini(h+1,dr,i*2+1);
}

void up( int i )
{
	for( i/=2 ; i ; i/=2 )
		arb[i]=max(arb[i*2],arb[i*2+1]);
}

int querry(int a,int b,int i)
{
	if(a>=y&&b<=z)
		return arb[i];
	int h=mij(a,b),st=-INF,dr=-INF;
	if( y<=h )
		st=querry(a,h,2*i);
	if( z>h )
		dr=querry(h+1,b,2*i+1);
	return max(st,dr);
}

void baz()
{
	for(int i=1 ; i<=n ; ++i)
		printf("%3d",poz[i]);
}

void read()
{
	int x;
	scanf("%d%d",&n,&m);
	ini(1,n,1);
	//baz();
	for( int i=1 ; i<=n ; ++i )
	{
		scanf("%d",&x);
		arb[ poz[i] ]=x;
		up(poz[i]);
	}
}

void solve()
{
	int x;
	while(m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(x==1)
		{
			arb[poz[y]]=z;
			up(poz[y]);
		}
		else
			printf("%d\n",querry(1,n,1));
	}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	read();
	solve();
	return 0;
}