Cod sursa(job #366352)

Utilizator AndreiDDiaconeasa Andrei AndreiD Data 21 noiembrie 2009 16:46:24
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <cstdio>

#define file_in "arbint.in"
#define file_out "arbint.out"

#define Nmax 401000

int n,m,v[Nmax],i,maxim,a,b,Ai[Nmax],tip,p;

inline int max(int a, int b) { return a>b?a:b; }

void update(int nod, int ls,int ld, int val)
{
	if (ls==ld)
	{
		Ai[nod]=val;
		return ;
	}
	
		int mij=(ls+ld)>>1;
		
		if (p<=mij)
			update(2*nod,ls,mij,val);
		else
		    update(2*nod+1,mij+1,ld,val);
		
		Ai[nod]=max(Ai[2*nod],Ai[2*nod+1]);
	
}

void query(int nod, int ls, int ld)
{
	if (a<=ls && ld<=b)
	{
		maxim=max(maxim,Ai[nod]);
		return ;
	}
	
	
	int mij=(ls+ld)>>1;
	if (a<=mij)
		query(2*nod,ls,mij);
	if (mij<b)
		query(2*nod+1,mij+1,ld);
}
	

int main()
{
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &m);
	for (i=1;i<=n;++i)
	{
		p=i;
		scanf("%d", &v[i]);
		update(1,1,n,v[i]);
	}

	while(m--)
	{
		scanf("%d %d %d", &tip, &a, &b);
		
		if (tip==1)
		{
			p=a;
			update(1,1,n,b);
		}
		else
		{
			maxim=-1;
			query(1,1,n);
			printf("%d\n", maxim);
		}
	}
	
	fclose(stdin);
	fclose(stdout);
	
	
	return 0;
}