Cod sursa(job #353831)

Utilizator SheepBOYFelix Liviu SheepBOY Data 6 octombrie 2009 13:31:55
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 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)>>1;
	cstr(st,mij,pos<<1);
	cstr(mij+1,dr,(pos<<1)+1);
}
void update(int pos,int val)
{
	int k=init[pos];
	arb[k]=val;
	for(k>>=1;k>0;k>>=1)
		arb[k]=max(arb[k<<1],arb[(k<<1)+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)>>1;
	return max(caut(st,mij,pos<<1),caut(mij+1,dr,(pos<<1)+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;
}