Cod sursa(job #404925)

Utilizator vladbBogolin Vlad vladb Data 26 februarie 2010 22:34:37
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include<stdio.h>

int n,m,v[600001];
int poz,x,k,a,b,max;

void arb(int nod,int st,int dr)
{	if(st==dr)
	{	v[nod]=x;
		return;
	}
	int mij=(st+dr)/2;
	if(poz<=mij) arb(2*nod,st,mij);
	else arb(2*nod+1,mij+1,dr);
	if(v[2*nod]>v[2*nod+1]) v[nod]=v[2*nod];
	else v[nod]=v[2*nod+1];
}

void cauta(int nod,int st,int dr)
{	if(a<=st&&dr<=b)
	{	if(max<v[nod]) max=v[nod];
		return;
	}
	int mij=(st+dr)/2;
	if(a<=mij) cauta(2*nod,st,mij);
	if(mij<b) cauta(nod*2+1,mij+1,dr);
}

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