Cod sursa(job #548279)

Utilizator tiriplicamihaiTiriplica Mihai Dragos tiriplicamihai Data 7 martie 2011 11:49:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <cstdio>

#define fs(x) x*2
#define fd(x) x*2+1

#define MaxN 100010

int M,N,arb[4*MaxN],max,val,poz,a,b;

int maxim(int a,int b)
{
	return (a>b)? a:b;
}


void update(int nod,int st,int dr)
{
	if(st==dr)
	{
		arb[nod]=val;
		return;
	}
	int m=(st+dr)/2;
	if(poz<=m)
		update(fs(nod),st,m);
	else
		update(fd(nod),m+1,dr);
	arb[nod]=maxim(arb[fs(nod)],arb[fd(nod)]);
}

void querry(int nod,int st,int dr)
{
	if(a<=st&&dr<=b)
	{
		if(max<arb[nod])
			max=arb[nod];
		return;
	}
	int m=(st+dr)/2;
	if(a<=m)
		querry(fs(nod),st,m);
	if(b>m)
		querry(fd(nod),m+1,dr);
}
	

void rez()
{
	int i,op;
	scanf("%d%d",&N,&M);
	for(i=1;i<=N;i++)
	{
		scanf("%d",&val);
		poz=i;
		update(1,1,N);
	}
	for(i=1;i<=M;i++)
	{
		scanf("%d%d%d",&op,&a,&b);
		if(op==0)
		{
			max=-1;
			querry(1,1,N);
			printf("%d\n",max);
		}
		else
		{
			val=b;poz=a;
			update(1,1,N);
		}
	}
}


int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	rez();
	fclose(stdin);
	fclose(stdout);
	return 0;
}