Cod sursa(job #386958)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 26 ianuarie 2010 13:58:59
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#define max(a,b) (a>b)?a:b
#define Nmax 100000
int ar[2*Nmax],a,b,n,op,m,maxl;
void update(int val,int poz,int nod, int st,int dr)
{
	if(st==dr)
	{
		ar[nod]=val;
		return;
	}
	int mij;
	mij=(st+dr)/2;
	if(poz<=mij)
		update(val,poz,2*nod,st,mij);
	else
		update(val,poz,2*nod+1,mij+1,dr);
	
	ar[nod]=max(ar[2*nod],ar[2*nod+1]);
}
void query(int nod, int st,int dr, int a, int b)
{
	if(st>=a && dr<=b)
	{
		if(maxl<ar[nod])
			maxl=ar[nod];
		return;
	}
	int mij=(st+dr)/2;
	if(a<=mij)
		query(2*nod,st,mij,a,b);
	if(b>mij)
		query(2*nod+1,mij+1,dr,a,b);
		
}
int main()
{
	int x;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&x);
		update(x,i,1,1,n);
	}
	for(int j=1;j<=m;j++)
	{	scanf("%d%d%d",&op,&a,&b);
		if(op==0)
		{
			maxl=0;
			query(1,1,n,a,b);//in loc de 1,n trebuie 1 si ultima pozitie din interval.
			printf("%d\n",maxl);
		}
		else
		{
			update(b,a,1,1,n);
		}
	}
	return 0;
}