Cod sursa(job #400595)

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

#define MAX(a,b) (a)>(b)?(a):(b)
int i,n,m,x,poz,val;
int A[263000];
int a,b,op;
 
void _update(int nod,int st,int dr);
int _find(int nod,int st,int dr);
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);
		poz = i,val=x;
		_update(1,1,n);
	}
	
	for(;m--;)
	{
		scanf("%d%d%d",&op,&a,&b);
		if(!op) printf("%d\n",_find(1,1,n));
		else poz=a,val=b,_update(1,1,n);
	}
	return 0;
}
 
void _update(int nod, int st, int dr)
{
	if(st == dr) 
	{
		A[nod] = val;
	}
	else
	{
		int mj = (st + dr) / 2;
		if(poz <= mj) _update(2*nod,st,mj);
		else _update(2*nod+1, mj+1,dr);
		A[nod] = MAX(A[2*nod],A[2*nod+1]);
	}
}

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