Cod sursa(job #354409)

Utilizator SheepBOYFelix Liviu SheepBOY Data 7 octombrie 2009 22:32:32
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.95 kb
#include<stdio.h>

int arb[280000];
int init[100000];
int n,m,x,y;
int max(int a,int b)
{
	return (a<b)?b:a;
}
void cstr(int st,int dr,int pos)
{
	if(st==dr){
		init[st]=pos;
		return ;
	}
	
	int mij=(st+dr)/2;
	cstr(st,mij,2*pos);
	cstr(mij+1,dr,2*pos+1);
}
void update(int pos,int val)
{
	int k=init[pos];
	arb[k]=val;
	for(k/=2;k>0;k/=2)
		arb[k]=max(arb[2*k],arb[2*k+1]);
}
inline int caut(int st,int dr,int pos)
{
	int mij;
	if(x<=st&&dr<=y)
		return arb[pos];
	if(dr<x||st>y)
		return 0;
	mij=(st+dr)/2;
	return max(caut(st,mij,2*pos),caut(mij+1,dr,2*pos+1));
}
int main()
{
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
	scanf("%d%d",&n,&m);
	int aux;
	cstr(1,n,1);
	for(int i=1;i<=n;++i)
	{
		scanf("%d",&aux);
		update(i,aux);
	}
	for(int i=0;i<m;++i)
	{
		scanf("%d",&aux);
		if(aux)
		{
			int val;
			scanf("%d%d",&aux,&val);
			update(aux,val);
		}
		if(!aux)
		{
			scanf("%d%d",&x,&y);
			printf("%d\n",caut(1,n,1));
		}
	}
	return 0;
}