Cod sursa(job #353821)

Utilizator andreii_93andrei ion andreii_93 Data 6 octombrie 2009 13:19:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>

int arb[280000],init[100002],n,x,y,m,tip,i;
void cstr(int st, int dr, int poz)
{
	if(st==dr)
	{
		init[st]=poz;
		return;
	}
	int mij=(st+dr)/2;
	cstr(st,mij,2*poz);
	cstr(mij+1,dr,2*poz+1);
}

int max(int a,int b)
{
	if(a<b) return b;
	else return a;
}

void update(int pozitie,int val)
{
	int k=init[pozitie];
	arb[k]=val;
	for(k/=2;k>0;k/=2)
		arb[k]=max(arb[2*k], arb[2*k+1]);
}

int caut(int st, int dr, int poz)
{
	if(x<=st&&dr<=y)
		return arb[poz];
	if(st>y||dr<x)
		return 0;
	int mij=(st+dr)/2;
	return max(caut(st,mij,2*poz), caut(mij+1,dr,2*poz+1));
}

int main()
{
	freopen("ab.in","rt",stdin);
	freopen("ab.out","wt",stdout);
	scanf("%d",&n); //n=lung sirului;
	scanf("%d",&m); //m=nr d operatii;
	
	//citirea val sirului
	for(i=1;i<=n;++i)
	{
		scanf("%d",x);
	
		//facem update in poz i cu val x
		update(i,x);
	}
	/*
	citirea operatiilor
	0-> adaug elem
	1->returnarea maximului pe interval
	*/
	for(i=1;i<=m;++i)
	{
		scanf("%d%d%D",&tip,&x,&y);
		if(tip==0) update(x,y);
		else
			printf("%d\n", caut(1,n,1));
	}
	return 0;
}