Cod sursa(job #266866)

Utilizator ZillaMathe Bogdan Zilla Data 26 februarie 2009 10:53:29
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include <stdio.h>


#define Nmax 100024

int a[3*Nmax], n, ret, m;

void up_(int ind,int st,int dr,int i,int nr)
{
	if (st == dr)
	{
		a[ind] = nr;
	}
		else
	{
		int mid = (st+dr)/2;
		if (i<=mid) up_(ind*2,st,mid,i,nr);
			else  up_(ind*2+1,mid+1,dr,i,nr);
		a[ind] = a[ind*2];
		if (a[ind] < a[ind*2+1])
			a[ind] = a[ind*2+1];
	}
}

void q(int ind,int st,int dr,int x,int y)
{
	if (x<=st && dr<=y)
	{
		if (a[ind] > ret)
			ret = a[ind];
	}
	else
	{
		int mid = (st+dr)/2;
		if (x<=mid) q(ind*2,st,mid,x,y);
		if (y>=mid+1) q(ind*2+1,mid+1,dr,x,y);
	}
}

int  Q(int st,int dr)
{
	ret = 0;
	q(1,1,n,st,dr);
	return ret;
}

void up(int i,int nr)
{
	up_(1,1,n,i,nr);
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	scanf("%d%d", &n,&m);

	int i,x,y,op;

	for (i=1;i<=n;++i)
	{
		scanf("%d", &x);
		up(i,x);
	}

	for (i=1;i<=m;++i)
	{
		scanf("%d%d%d", &op,&x,&y);
		if (op==0) printf("%d\n", Q(x,y));
			else up(x,y);
	}
	return 0;
}