Cod sursa(job #518362)

Utilizator blastoiseZ.Z.Daniel blastoise Data 31 decembrie 2010 12:16:13
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.88 kb
#include <stdio.h>

int N,M,i,x,a,b;
int T[200001];

inline int fm(int a,int b)
{
	if(a>b) return a;
	else return b;
}

inline void add(int nod,int L,int R,int pos,int val)
{
	int M=(L+R)/2;

	if(L==pos&&pos==R) T[nod]=val;
	else
	{
		if(pos<=M) add(2*nod,L,M,pos,val);
		else add(2*nod+1,M+1,R,pos,val);
		T[nod]=fm(T[2*nod],T[2*nod+1]);
	}
}

inline int max(int nod,int L,int R)
{
	int M=(L+R)/2,sol1=0,sol2=0;
	
	if(a<=L&&R<=b) return T[nod];
	else
	{
		if(a<=M) sol1=max(2*nod,L,M);
		if(M<b) sol2=max(2*nod+1,M+1,R);
		return fm(sol1,sol2);
	}
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	scanf("%d%d",&N,&M);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&x);
		add(1,1,N,i,x);
	}

	for(i=1;i<=M;i++)
	{
		scanf("%d%d%d",&x,&a,&b);
		if(x==0) printf("%d\n",max(1,1,N));
		else add(1,1,N,a,b);
	}

	return 0;
}