Cod sursa(job #218596)

Utilizator stinkyStinky si Grasa stinky Data 2 noiembrie 2008 18:57:09
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#define N 100000
#define INF 100001

int x,y,n,m,a[N<<2],b[N<<2],t[N<<2],fr[N];

inline void arbore(int p,int st,int dr)
{
	if(st==dr)
	{
		fr[st]=p;
		a[p]=b[p]=st;
		return;
	}
	a[p]=st;
	b[p]=dr;
	int m=(st+dr)>>1;
	arbore(p<<1,st,m);
	arbore((p<<1)+1,m+1,dr);
}
/*
void proba(int n)
{
	for(int i=1;i<=n<<2;++i)
		printf("arb(%d)=[%d,%d] %d\n",i,a[i],b[i],t[i]);
	for(int i=1;i<=n;++i)
		printf("%d ",fr[i]);
}
*/
inline int maxim(int x,int y)
{
	return x>y ? x : y;
}

inline void update(int p,int val)
{
	if(a[p]==b[p])
		t[p]=val;
	else
		t[p]=maxim(t[p<<1],t[(p<<1)+1]);
	if(p>=1)
		update(p>>1,val);
}

void init()
{
	int x;
	scanf("%d%d",&n,&m);
	arbore(1,1,n);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&x);
		update(fr[i],x);
	}
}

int query(int p)
{
	if(x<=a[p] && b[p]<=y)
		return t[p];
	int rez=-INF;
	if(x<=b[p<<1])
		rez=query(p<<1);
	if(y>=a[(p<<1)+1])
		rez=maxim(rez,query((p<<1)+1));
	return rez;
}

void solve()
{
	int tip;
	while(m--)
	{
		scanf("%d%d%d",&tip,&x,&y);
		if(tip==0)
			printf("%d\n",query(1));
		else
			update(fr[x],y);
	}
}

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