Cod sursa(job #784984)

Utilizator stef1995mmarcu stefan ovidiu stef1995m Data 7 septembrie 2012 15:40:34
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include<iostream>
#include<fstream>
using namespace std;
const int maxx=400020;
int n,m,i,x,arbint[maxx],j,tip,a,b,k,max1[3];
void update(int nod,int left,int right)
{
	int mij;
	if(left==right)
	{
		arbint[nod]=x;
		return;
	}
	else
	{
		mij=(left+right)/2;
		if(i<=mij)
			update(2*nod,left,mij);
		else
			update(2*nod+1,mij+1,right);
		arbint[nod]=max(arbint[2*nod],arbint[2*nod+1]);
	}
}
void find(int nod,int left,int right)
{
	int mij;
	if(a<=left&&b>=right)
	{
		max1[++k]=arbint[nod];
		return;
	}
	else
	{
		mij=(left+right)/2;
		if(a<=mij)
			find(2*nod,left,mij);
		if(b>mij)
			find(2*nod+1,mij+1,right);
	}
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d %d\n",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		update(1,1,n);
	}
	for(j=1;j<=m;j++)
	{
		scanf("%d %d %d\n",&tip,&a,&b);
		if(tip==0)
		{
			k=0;
			find(1,1,n);
			printf("%d\n",max(max1[1],max1[2]));
			max1[1]=max1[2]=0;
		}
		else
		{
			i=a;
			x=b;
			update(1,1,n);
		}
	}
	return 0;
}