Cod sursa(job #354039)

Utilizator mariusandreiMarius Lucian Andrei mariusandrei Data 6 octombrie 2009 21:59:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include<stdio.h>

int arb[280000],init[100005];
int n,x,y,tip,i,m;
inline int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

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);
}

void uptade(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("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d",&n); //n->lungimea sirului
	scanf("%d", &m); //m-> numarul de operatii
	cstr(1,n,1);
	//citire
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		uptade(i,x);
	}
	// citim operatiile
	// 0->adaugam element
	// 1-> returnarea maximului pe interval
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d", &tip,&x,&y);
		if(tip==0)
			printf("%d\n",caut(1,n,1));
		else
			uptade(x,y);	
	}		
	return 0;
	
	
}