Cod sursa(job #676320)

Utilizator lianaliana tucar liana Data 8 februarie 2012 23:23:00
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#define nmax 100005 
long a, b, op, v[2*nmax], max, n, m, i, x;

void calc(long st, long dr, long nod)
{
	if ((a<=st)&&(dr<=b))
	{
		if (v[nod]>max)
			max=v[nod];
	}
	else
	{
		long  mij=(st+dr)/2-1+(st+dr)%2;
		if (a<=mij)
			calc(st,mij,nod*2);
		if (mij+1<=b)
			calc(mij+1,dr,nod*2+1);
	}
}

void schimbare(long st, long dr, long nod)
{
	long mij=(st+dr)/2-1+(st+dr)%2;
	if (st!=dr)
	{
		if (a<=mij)
			schimbare(st,mij,nod*2);
		else
			schimbare(mij+1,dr,nod*2+1);
		v[nod]=v[nod*2];
		if (v[nod*2+1]>v[nod])
			v[nod]=v[nod*2+1];
	}
	else
		v[nod]=b;
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld %ld",&n,&m);
	for (i=1;i<=n;i++)
	{
		scanf("%ld",&x);
		a=i;	b=x;
		schimbare(1,n,1);
	}
	for (i=1;i<=m;i++)
	{
		scanf("%ld %ld %ld",&op,&a,&b);	max=-1;
		if (op==0)
		{
			calc(1,n,1);
			printf("%ld\n",max);
		}
		if (op==1)
			schimbare(1,n,1);
	}
	return 0;
}