Cod sursa(job #520267)

Utilizator AndreyPAndrei Poenaru AndreyP Data 7 ianuarie 2011 19:28:00
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include<stdio.h>
int n,m,max;
#define N 100005
int t[2*N];
int val,poz,x,y,z,a,b;
const int inf=-(1<<30);
void actual(int p,int u,int i)
{
	if(p==u)
	{
		t[i]=val;
		return;
	}
	int m=(p+u)>>1;
	if(poz<=m)
		actual(p,m,i<<1);
	else
		actual(m+1,u,(i<<1)+1);
	if(t[i<<1]>t[(i<<1)+1])
		t[i]=t[i<<1];
	else
		t[i]=t[(i<<1)+1];
}
void maxim(int p,int u,int i)
{
	if(a<=p && u<=b)
	{
		if(t[i]>max)
			max=t[i];
		return;
	}
	int m=(p+u)>>1;
	if(a<=m)
		maxim(p,m,i<<1);
	if(m<b)
		maxim(m+1,u,(i<<1)+1);
}
int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(poz=1; poz<=n; poz++)
	{
		scanf("%d",&val);
		actual(1,n,1);
	}
	for(; m; m--)
	{
		scanf("%d%d%d",&x,&y,&z);
		if(x)
		{
			poz=y;
			val=z;
			actual(1,n,1);
		}
		else
		{
			max=inf;
			a=y;
			b=z;
			maxim(1,n,1);
			printf("%d\n",max);
		}
	}
	return 0;
}