Cod sursa(job #501813)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 16 noiembrie 2010 19:00:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>

const int maxn=100001;
int i,N,M,poz,val,x,a,b,max,ArbInt[5*maxn];

int maxim(int a, int b)
{
	if(a>b) return a;
	return b;
}
void update(int k, int st, int dr)
{
	if(st==dr)
	{
		ArbInt[k]=val;
		return;
	}
	int m=st+(dr-st)/2;
	if(poz<=m) update(2*k,st,m);
		else update(2*k+1,m+1,dr);
	ArbInt[k]=maxim(ArbInt[2*k],ArbInt[2*k+1]);
}

void caut(int k, int st, int dr)
{
	if(a<=st && dr<=b)
	{
		if(ArbInt[k]>max) max=ArbInt[k];
		return;
	}
	int m=st+(dr-st)/2;
	if(a<=m) caut(2*k,st,m); // a E {st,m}
	if(m<b)  caut(2*k+1,m+1,dr); // b E {m+1,dr}
}

void citire()
{
	scanf("%d %d",&N,&M);
	for(i=1;i<=N;i++) 
	{
		scanf("%d",&x);
		poz=i; val=x;
		update(1,1,N);
	}
}


int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	citire();
	for(i=1;i<=M;i++)
	{
		scanf("%d %d %d",&x,&a,&b);
		if(x==0)
		{
			max=-1;
			caut(1,1,N);
			printf("%d\n",max);
		}
		if (x==1)
		{
			poz=a; val=b;
			update(1,1,N);
		}
	}
}