Cod sursa(job #327735)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 29 iunie 2009 23:57:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<stdio.h>
int n,m,max;
int p,x,pr,ul;
int v[400075];

inline int maxim(int a, int b)
{
	if(a>b)
		return a;
	return b;
}

void update(int nod, int st, int dr)
{
	if(st==dr)
	{
		v[nod]=x;
		return;
	}
	int m=(st+dr)>>1;
	if(p<=m)
		update(nod*2,st,m);
	else
		update(nod*2+1,m+1,dr);
	v[nod]=maxim(v[nod*2],v[nod*2+1]);
}

void query(int nod, int st, int dr)
{
	if(pr<=st && dr<=ul)
	{
		if(max<v[nod])
			max=v[nod];
		return;
	}
	int m=(st+dr)>>1;
	if(pr<=m)
		query(nod*2,st,m);
	if(m<ul)
		query(nod*2+1,m+1,dr);
}

void read()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	int i;
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		p=i;
		update(1,1,n);
	}
	int t,a,b;
	for(i=1;i<=m;i++)
	{
		scanf("%d%d%d",&t,&a,&b);
		if(t==0)
		{
			max=0;
			pr=a;ul=b;
			query(1,1,n);
			printf("%d\n",max);
		}
		else
		{
			p=a;x=b;
			update(1,1,n);
		}
	}
}

int main()
{
	read();
	return 0;
}