Cod sursa(job #459134)

Utilizator andrei.dAndrei Diaconeasa andrei.d Data 27 mai 2010 22:23:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>

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

#define nmax 501000

int n,q;
int ai[nmax];
int sol;

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

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

void query(int nod, int ls, int ld, int left, int right)
{
	if (left<=ls && ld<=right)
	{
		if (sol<ai[nod])
			sol=ai[nod];
		return ;
	}
	
	int mij;

    mij=(ls+ld)>>1;
    if (left<=mij)
		query(2*nod,ls,mij,left,right);
	if (right>mij) 
		query(2*nod+1,mij+1,ld,left,right);
}

void citire()
{
	int i,x;
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &n, &q);
	for (i=1;i<=n;++i) 
	{
		scanf("%d", &x);
		update(1,1,n,i,x);
	}
}

		

void solve()
{
	int tip,x,y;
	while(q--)
	{
		scanf("%d %d %d", &tip,&x, &y);
		
		if (tip==0)
		{
			sol=-0x3f3f3f3f;
			query(1,1,n,x,y);
			printf("%d\n", sol);
		}
		else
			update(1,1,n,x,y);
	}
	
}


int main()
{
	citire();
	solve();
	
	fclose(stdin);
	fclose(stdout);
	
	return 0;
	
}