Cod sursa(job #520364)

Utilizator Andreid91Ciocan Andrei Andreid91 Data 8 ianuarie 2011 11:04:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb

#include<stdio.h>


int n,q,v[100005],ai[400000],a,b;

void cst(int k, int st, int dr)
{
	if (st==dr)
	{
		ai[k]=v[st];
		return;
	}
	
	int mij=(st+dr)/2;
	
	cst(2*k,st,mij);
	cst(2*k+1,mij+1,dr);
	
	ai[k]=ai[k*2];
	if (ai[k]<ai[k*2+1]) 
		ai[k]=ai[k*2+1];
}

int getmax(int k, int st, int dr)
{
	if (st>=a && dr<=b)
		return ai[k];
	
	int mij=(st+dr)/2;
	int val1=0,val=0;
	
	if (mij>=a)
		val=getmax(2*k,st,mij);
	if (mij<b)
		val1=getmax(2*k+1,mij+1,dr);
	
	if (val1>val)
		return val1;
	else 	
		return val;
}	

void update( int k, int st, int dr)
{
	if (st==dr)
	{
		ai[k]=v[a];
		return;
	}
	
	int mij=(st+dr)/2;
	
	if (mij>=a)
		update(k*2,st, mij);
	else
		update (k*2+1, mij+1, dr);
	
	ai[k]=ai[k*2];
	if (ai[k]<ai[k*2+1])
		ai[k]=ai[k*2+1];
	
}

int main ()
{
	int op,i,j,max2,val;
	freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&q);
	for (i=1;i<=n;i++)
	{
		scanf("%d",&val);
		v[i]=val;
		
	}
	cst(1,1,n);
	
	for (i=1;i<=q;i++)
	{
		scanf("%d%d%d",&op,&a,&b);
		if (op==0)
		{
			max2=getmax (1,1,n);
			printf("%d\n",max2);
		}
		else
		{
			v[a]=b;
			update (1,1,n);
		}
	}
	return 0;
}