Cod sursa(job #885207)

Utilizator NistorSergiuNistor Sergiu NistorSergiu Data 21 februarie 2013 18:37:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include<cstdio>
using namespace std;
int maxarb[400070];
int mx,poz,val,start,final;
int maxim(int a, int b)
{
	if(a>b)
		return a;
	return b;
}
void update(int nod, int st, int dr)
{
	int mij;
	if(st==dr)
	{
		maxarb[nod]=val;
		return;
	}
	mij=(st+dr)/2;
	if(poz<=mij)
		update(2*nod,st,mij);
	else
		update(2*nod+1,mij+1,dr);
	maxarb[nod]=maxim(maxarb[2*nod],maxarb[2*nod+1]);
}
void query(int nod, int st, int dr)
{
	int mij,v1=-1,v2=-1;
	if((st>=start)&&(dr<=final))
	{
		if(maxarb[nod]>mx)
			mx=maxarb[nod];
		return;
	}
	mij=(st+dr)/2;
	if(start<=mij)
		query(2*nod,st,mij);
	if(final>mij)
		query(2*nod+1,mij+1,dr);
}
int main()
{
	int n,m,i,x,a,b;
	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);
		poz=i;val=x;
		update(1,1,n);
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d\n",&x,&a,&b);
		if(x==0)
		{
			mx=-1;
			start=a;final=b;
			query(1,1,n);
			printf("%d\n",mx);
		}
		else
		{
			poz=a;
			val=b;
			update(1,1,n);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}