Cod sursa(job #266879)

Utilizator ZillaMathe Bogdan Zilla Data 26 februarie 2009 11:20:51
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <stdio.h>

#define Nmax 100100

int a[3*Nmax],max,n,m,x;

void up(int st,int dr,int i,int pas)
{
	if(st==dr)
		a[pas]=x;
	else
		{
		if(i<=(st+dr)/2)
			up(st,(st+dr)/2,i,2*pas);
		else
			if(i>(st+dr)/2)
				up((st+dr)/2+1,dr,i,2*pas+1);
		a[pas]=a[pas*2];
		if(a[pas*2+1]>a[pas])
			a[pas]=a[pas*2+1];
		}
}

void q(int st,int dr, int x_,int y,int pas)
{
	if(x_<=st && dr<=y)
		{
			if(max<a[pas])
				max=a[pas];
		}
	else
		{
			int mij=(st+dr)/2;
			if(x_<=mij)	q(st,mij,x_,y,pas*2);
			if(y>mij)	q(mij+1,dr,x_,y,pas*2+1);
		}
}
int main()
{
	int i,y,op;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;++i)
		{
			scanf("%d",&x);
			up(1,n,i,1);
		}
	for(i=1;i<=m;++i)
		{
			scanf("%d%d%d",&op,&y,&x);
			if(op==0)
				{
					max=0;
					q(1,n,y,x,1);
					printf("%d\n",max);
				}
			else
				up(1,n,y,1);
		}
	return 0;
}