Cod sursa(job #278973)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 12 martie 2009 17:06:26
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
//BC
/*
Care este diferenta dintre o blonda si muntele Everest?
Pe Everest nu urca oricine
*/

#include <stdio.h>
#define maxN 100000
#define max(a,b) a>b?a:b

int S[maxN*5];
int sir[maxN];
int n,m,poz,St,Dr,rez;

void creare(int nod,int st,int dr)
{
	if (st==dr)
	{
		S[nod]=sir[st];
		return ;
	}

	int mij=(st+dr)>>1;
	int nodS=nod<<1;
	int nodD=nodS+1;

	creare(nodS,st,mij);
	creare(nodD,mij+1,dr);

	S[nod]=max(S[nodS],S[nodD]);
}

void citire()
{
	freopen ("arbint.in","r",stdin);
	freopen ("arbint.out","w",stdout);
	scanf ("%d %d",&n,&m);
	for (int i=1;i<=n;i++)
		scanf ("%d ",&sir[i]);
	creare(1,1,n);
}

void update(int nod,int st,int dr)
{
	if (st==dr)
	{
		S[nod]=sir[st];
		return ;
	}

	int mij=(st+dr)>>1;
	int nodS=nod<<1;
	int nodD=nodS+1;

	if (mij>=poz)
		update(nodS,st,mij);
	else
		update(nodD,mij+1,dr);

	S[nod]=max(S[nodS],S[nodD]);
}

void maxim(int nod,int st,int dr)
{
	if (St<=st && dr<=Dr)
	{
		rez=max(rez,S[nod]);
		return ;
	}

	int mij=(st+dr)>>1;
	int nodS=nod<<1;
	int nodD=nodS+1;

	if (St<=mij)
		maxim(nodS,st,mij);
	if (Dr>=mij+1)
		maxim(nodD,mij+1,dr);
}

void solve()
{
	int tip;
	for (int i=0;i<m;i++)
	{
		scanf ("%d %d %d",&tip,&St,&Dr);
		if (tip)
		{
			sir[St]=Dr;
			poz=St;
			update(1,1,n);
		}
		else
		{
			rez=-32000;
			maxim(1,1,n);
			printf("%d\n",rez);
		}
	}
}

int main ()
{
	citire();
	solve();
	return 0;
}