Cod sursa(job #562084)

Utilizator darkseekerBoaca Cosmin darkseeker Data 22 martie 2011 11:45:16
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <cstdio>
using namespace std;

#define Input "arbint.in"
#define Output "arbint.out"
#define NMAX 100001

int arb[4*NMAX+200],pos,val,middle,maxim,start,final;

inline int max(int a,int b)
{
	if(a>b)
		return a;
	return b;
}

void update(int node,int left,int right)
{
	if(left==right)
	{
		arb[node]=val;
		return;
	}
	middle=(left+right)/2;
	if(pos<=middle)
		update(2*node,left,middle);
	if(pos>middle)
		update(2*node+1,middle+1,right);
	arb[node]=max(arb[2*node],arb[2*node+1]);
}

void query(int node,int left,int right)
{
	if(start<=left && right<=final)
		{
			if(maxim<arb[node])
				maxim=arb[node];
			return;
	}
	middle=(right+left)/2;
	if(start<=middle)
		query(2*node,left,middle);
	if(middle<final)
		query(2*node+1,middle+1,right);
	
}


int main()
{
	int n,m,i,type,v1,v2;
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&val);
		pos=i;
		update(1,1,n);
	}
	
	for(i=1;i<=m;i++)
	{
		scanf("%d %d %d",&type,&v1,&v2);
		if(!type)
		{
			start=v1;
			final=v2;
			maxim=0;
			query(1,1,n);
			printf("%d\n",maxim);
		}
		else
		{
			pos=v1;
			val=v2;
			update(1,1,n);
		}
	}
}