Cod sursa(job #360996)

Utilizator proflaurianPanaete Adrian proflaurian Data 3 noiembrie 2009 11:37:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.81 kb
#include<stdio.h>
int n,m,B,i,v[300000],O,a,b,c,MAX(int L,int R,int N);
void read(),solve();
int main()
{
	read();
	solve();
	return 0;
}
void read()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	B=1;for(;B<n;B<<=1);O=B-1;
	for(i=O+1;i<=O+n;i++)scanf("%d",&v[i]);
	for(i=O+n+1;i<=O+B;i++) v[i]=0;
}
void solve()
{
	for(i=O;i>=1;i--)v[i]=v[2*i]>v[2*i+1]?v[2*i]:v[2*i+1];
	for(;m;m--)
	{
		scanf("%d %d %d",&c,&a,&b);
		if(c)
		{
			v[O+a]=b;i=(O+a)/2;
			for(;i;i>>=1)
				v[i]=v[2*i]>v[2*i+1]?v[2*i]:v[2*i+1];
			continue;
		}
		printf("%d\n",MAX(1,B,1));
	}
}
int MAX(int L,int R,int N)
{
	int M,M1,M2;
	if(a<=L&&b>=R)return v[N];
	if(b<L || R<a) return 0;
	M=(L+R)>>1;
	M1=MAX(L,M,2*N);
	M2=MAX(M+1,R,2*N+1);
	return M1>M2?M1:M2;
}