Cod sursa(job #795096)

Utilizator radustn92Radu Stancu radustn92 Data 7 octombrie 2012 16:12:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <stdio.h>
#define NMAX 100005
#define LMAX (1<<18)
int n,m,A[NMAX],arb[LMAX],ap[NMAX],a,b;
void read()
{
	scanf("%d%d",&n,&m);
	int i;
	for (i=1; i<=n; i++)
		scanf("%d",&A[i]);
}
inline int max(int x,int y)
{
	return x>y ? x : y;
}
void cstr(int st,int dr,int nod)
{
	if (st==dr)
	{
		arb[nod]=A[st];
		ap[st]=nod;
		return ;
	}
	int mij=(st+dr)/2;
	cstr(st,mij,nod*2);
	cstr(mij+1,dr,nod*2+1);
	arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
inline int find(int st,int dr,int nod)
{
	if (b<st || dr<a)
		return 0;
	if (a<=st && dr<=b)
		return arb[nod];
	int mij=(st+dr)/2;
	return max(find(st,mij,nod*2),find(mij+1,dr,nod*2+1));
}
void change(int poz,int val)
{
	int nod=ap[poz];
	arb[nod]=val;
	for ( nod/=2 ; nod ; nod/=2)
		arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void solve()
{
	int i,tip;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&tip,&a,&b);
		if (tip==0)
			printf("%d\n",find(1,n,1));
		else
			change(a,b);
	}
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	read();
	cstr(1,n,1);
	solve();
	return 0;
}