Cod sursa(job #400609)

Utilizator AnDrEwBoYA Andrei AnDrEwBoY Data 21 februarie 2010 17:57:52
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<stdio.h>

#define MAX(a,b) (a)>(b)?(a):(b)

int A[263000];

 
inline void _update(int nod,int st,int dr,int poz,int val);
inline int _find(int nod,int st,int dr,int a,int b);
int main()
{
	int i,n,m,x;
	int a,b,op;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	
	for(i = 1; i <= n;i++)
	{
		scanf("%d",&x);
		_update(1,1,n,i,x);
	}
	
	while(m--)
	{
		scanf("%d%d%d",&op,&a,&b);
		if(!op) printf("%d\n",_find(1,1,n,a,b));
		else _update(1,1,n,a,b);
	}
	return 0;
}
 
inline void _update(int nod, int st, int dr, int poz, int val)
{
	if(st == dr) 
	{
		A[nod] = val;
	}
	else
	{
		int mj = (st + dr) / 2;
		if(poz <= mj) _update(2*nod,st,mj,poz,val);
		else _update(2*nod+1, mj+1,dr,poz,val);
		A[nod] = MAX(A[2*nod],A[2*nod+1]);
	}
}

inline int _find(int nod,int st,int dr,int a,int b)
{
	if(a<=st && b>=dr) return A[nod];
	int mj  = (st+dr)/2,maxim=-1;
	 
	if(mj>=a) maxim = _find(nod*2,st,mj,a,b);
	if(mj<b)  maxim1 = _find(nod*2+1,mj+1,dr,a,b);
	return MAX(maxim1,maxim);
}