Cod sursa(job #497753)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 3 noiembrie 2010 11:28:30
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>

int m,x,i,j,s[600000],n,max,b,a,poz;

void baga(int nod,int st,int dr)
{
	int m;
	
	m=(st+dr)/2;
	if (st==poz&&dr==poz)
	{
		s[nod]=x;
		return;
	}
	
	if (poz<=m) baga(nod*2,1,m);
		else baga(nod*2+1,m+1,dr);
	
	if (s[2*nod]>s[2*nod+1]) s[nod]=s[2*nod];
			else s[nod]=s[2*nod+1];
}

void rezolva(int nod,int st,int dr)
{
	int m;
	if (st>=a&&dr<=b)
	{
		if (s[nod]>max) max=s[nod];
		return;
	}
	
	m=(st+dr)/2;
	if (a<=m) rezolva(2*nod,1,m);
	if (a>m) rezolva(2*nod+1,m+1,dr);
}


int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);	
	
	scanf("%d%d",&n,&m);
	
	for (i=1;i<=n;i++)
	{
		scanf("%d",&x);
		poz=i;
		baga(1,1,n);
	}
	
	for (i=1;i<=m;i++)
	{
		scanf("%D%D%D\n",&x,&a,&b);
		if (x==0)
		{
			max=-1;
			rezolva(1,1,n);
			printf("%d\n",max);
		}
		
		if (x==1)
		{
			x=b;
			poz=a;
			baga(1,1,n);
		}
	}
	return 0;
}