Cod sursa(job #423664)

Utilizator antoanelaAntoanela Siminiuc antoanela Data 24 martie 2010 09:50:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>
#define nmax 100010

int v[4*nmax], n, m, pos, val, start, finish, rs;

inline int max(int a, int b)
{
	if (a>b) return a;
	return b;
}

void update(int nod, int l, int r)
{
	if (l==r) v[nod]=val; else
	{
		int m=(l+r)/2;
		if (pos<=m) update(2*nod,l,m); else 
			update(2*nod+1,m+1,r);
		v[nod]=max(v[2*nod], v[2*nod+1]);
	}
}

int query(int nod, int l, int r)
{
	if (start<=l && r<=finish)
		rs=max(rs,v[nod]); else
		{
			int m=(l+r)/2;
			if (start<=m) query(2*nod, l, m);
			if (m<finish) query(2*nod+1, m+1, r);
		}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d %d",&n,&m);
	int i, t, a, b;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&val);
		pos=i;
		update(1,1,n);
	}
	while (m--)
	{
		scanf("%d %d %d",&t,&a,&b);
		if (t==1)
		{
			pos=a;
			val=b;
			update(1,1,n);
		} else
		{
			rs=-1;
			start=a;
			finish=b;
			query(1,1,n);
			printf("%d\n",rs);
		}
	}
}