Cod sursa(job #145557)

Utilizator ProtomanAndrei Purice Protoman Data 28 februarie 2008 22:47:36
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <stdio.h>
#define mx 100000
long n,a,b,c,i,m,s;
long ai[mx];

long max(int a, int b)
{
	long m;
	m=a;
	if (m<b)
		m=b;
	return m;
}

void comp(int nod)
{
	if (ai[nod]>s)
		s=ai[nod];
}

void add(int nod, int p, int u, int poz, int val, int pr)
{
	long m;
	if (p==u)
		ai[nod]=val;
	else
	{
		m=(p+u)/2;
		if (poz<=m)
			add(2*nod,p,m,poz,val,pr);
		if (m<poz)
			add(2*nod+1,m+1,u,poz,val,pr);
		ai[nod]=max(ai[2*nod],ai[2*nod+1]);
	}
}

void query(int nod, int p, int u)
{
	long m;
	if (a<=p && u<=b)
	{
		comp(nod);
		return;
	}
	if (p<u)
	{
		m=(p+u)/2;
		if (a<=m)
			query(2*nod,p,m);
		if (m<b)
			query(2*nod+1,m+1,u);
	}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for (i=1; i<=n; i++)
	{
		scanf("%ld",&a);
		add(1,1,n,i,a,0);
	}
	for (i=1; i<=n; i++)
	{
		scanf("%ld %ld %ld",&c,&a,&b);
		if (c==1)
			add(1,1,n,a,b,1);
		else 
		{
			s=0;
			query(1,1,n);
			printf("%ld\n",s);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}