Cod sursa(job #302402)

Utilizator DraStiKDragos Oprica DraStiK Data 8 aprilie 2009 21:16:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <stdio.h>
#define DIM 100005
int aib[3*DIM];
int n,m,maxn;
void update (int nod,int st,int dr,int poz,int nr);
void query (int nod,int st,int dr,int in,int sf);
int main ()
{
	freopen ("arbint.in","r",stdin);
	freopen ("arbint.out","w",stdout);
	int i,nr,a,b;
	scanf ("%d%d",&n,&m);
	for (i=1; i<=n; ++i)
	{
		scanf ("%d",&nr);
		update (1,1,n,i,nr);
	}
	for (i=1; i<=m; ++i)
	{
		scanf ("%d%d%d",&nr,&a,&b);
		if (nr==1)
			update (1,1,n,a,b);
		else
		{
			maxn=-1;
			query (1,1,n,a,b);
			printf ("%d\n",maxn);
		}
	}
	return 0;
}
int maxim (int a,int b)
{
	if (a>b)
		return a;
	return b;
}
void update (int nod,int st,int dr,int poz,int nr)
{
	if (st==dr)
		aib[nod]=nr;
	else
	{
		int mij=(st+dr)/2;
		if (poz<=mij)
			update (2*nod,st,mij,poz,nr);
		else
			update (2*nod+1,mij+1,dr,poz,nr);
		aib[nod]=maxim (aib[2*nod],aib[2*nod+1]);
	}
}
void query (int nod,int st,int dr,int in,int sf)
{
	if (st>=in && dr<=sf)
	{
		if (aib[nod]>maxn)
			maxn=aib[nod];
	}
	else
	{
		int mij=(st+dr)/2;
		if (in<=mij)
			query (2*nod,st,mij,in,sf);
		if (sf>mij)
			query (2*nod+1,mij+1,dr,in,sf);
	}
}