Cod sursa(job #1037821)

Utilizator roby2001Sirius roby2001 Data 20 noiembrie 2013 19:31:39
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
/*
          ~Keep It Simple!~
*/




#include <stdio.h>

int n,m,max;
int ar[200001];


void Add(int node,int a,int b,int poz,int val)
{
	if(a<=poz && poz<=b)
		if(ar[node] < val) 
			ar[node] = val;
	if( a == b )
		return;
	int mid = (a + b)/2;
	if( a<=poz && poz <= mid)
		Add(2*node,a,mid,poz,val);
	else if( mid<=poz && poz <= b)
		Add(2*node+1,mid+1,b,poz,val);
}
void ask(int node,int left, int right, int a, int b)
{
	if( a<=left && b >= right)
	{
		if(max < ar[node]) max = ar[node];
		return;
	}
	int mid = (left+right)/2;
	if( a <= mid )
		ask(2*node,left,mid,a,b);
	if ( b > mid )
		ask(2*node+1,mid+1 ,right,a,b);
}

void update(int node,int left,int right,int poz,int val)
{
	if( left == right )
	{
		ar[node] = val;
		return;
	}
	else
	{
		int mid = (left+right)/2;
		if( left<= poz && poz <= mid) update(2*node,left,mid,poz,val);
		else if ( mid<=poz && poz<=right) update(2*node+1,mid+1,right,poz,val);

		ar[node] = ar[2*node] > ar[2*node+1] ? ar[2*node]:ar[2*node+1];
	}
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	scanf("%d%d",&n,&m);

	int x,y,z;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		Add(1,1,n,i,x);
	}

	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&z,&x,&y);
		if( z == 0 )
		{
			max = 0;
			ask(1,1,n,x,y);
			printf("%d\n",max);
		}
		else if ( z == 1)
		{
			update(1,1,n,x,y);
		}
	}
}