Cod sursa(job #400576)

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

#define MAX(a,b) (a)>(b)?(a):(b)
int i,n,m,x;
int A[230000];

 
void _update(int nod,int st,int dr,int poz,int val);
int _find(int nod,int st,int dr,int a,int b);
int main()
{
	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);
	}
	
	for(;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;
}
 
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]);
	}
}

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)  maxim = MAX(maxim, _find(nod*2+1,mj+1,dr,a,b));
	return maxim;
}