Cod sursa(job #200380)

Utilizator andrei-alphaAndrei-Bogdan Antonescu andrei-alpha Data 23 iulie 2008 17:26:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#include <algorithm>
#define IN  "arbint.in"
#define OUT "arbint.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<20

using namespace std;
int poz,x,y,t,val,N,M;
int a[N_MAX];

inline int left(int nod)
{
	return nod << 1;
}
inline int right(int nod)
{
	return (nod << 1) + 1;
}	

void scan()
{
	freopen(IN, "r",stdin);
	freopen(OUT, "w",stdout);
	scanf("%d%d", &N,&M);
}

void update(int nod,int p,int u)
{
	if(p == u)
	{
		a[nod] = val;
		return ;
	}
	int m = (p+u)/2;
	if(poz <= m)
		update(left(nod),p,m);
	else
		update(right(nod),m+1,u);
	
	a[nod] = max(a[left(nod)],a[right(nod)]);
}

inline int querry(int nod,int p,int u)
{
	if(x <= p && u <= y)
		return a[nod];
	int m = (p+u)/2,xx=0,yy=0;
	if( x <= m )
		xx = querry(left(nod),p,m);
	if( y > m )
		yy = querry(right(nod),m+1,u);
	return max(xx,yy);		
}	
	
void solve()
{
	FOR(i,1,N)
	{
		scanf("%d", &val);
		poz=i;
		update(1,1,N); 
	}	
	FOR(i,1,M)
	{
		scanf("%d%d%d", &t,&x,&y);
		if(t)
		{
			val = y;
			poz = x;
			update(1,1,N);
		}	
		else
			printf("%d\n", querry(1,1,N) );
	}	
}

int main()
{
	scan();
	solve();
	return 0;
}