Cod sursa(job #786878)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 12 septembrie 2012 11:54:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;

int nr,pos,valoare,a,b;
int arb[400050];
int maxim=-1;


void update(int nod,int left,int right)
{	
	if(left==right)
	{
		arb[nod]=valoare;
		return;
	}
	int mij=(left+right)/2;
	if(pos<= mij) update(2*nod,left,mij);
		else update(2*nod+1,mij+1,right);
	
	arb[nod]=max(arb[2*nod],arb[2*nod+1]);
	return;	
}

void caut(int nod,int left,int right)
{
	//if(a==1 && b==3)
	//printf("%d %d\n",left,right);
	if(a<=left && b>=right)
	{
		maxim=max(maxim,arb[nod]);
		return;
	}
	int mij=(left+right)/2;
	
	if( a <= mij) caut(2*nod,left,mij);
	if( mij < b ) caut(2*nod+1,mij+1,right);
		
	return;
}


int main()
{	
	int n,m;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&nr);
		pos=i;
		valoare=nr;
		update(1,1,n);//nod,left,right
	}
	//cout<<arb[1]<<" : "<<arb[2]<<" "<<arb[3]<<" "<<arb[4]<<" "<<arb[5]<<" "<<arb[10]<<endl;
	for(int i=1;i<=m;i++)
	{	
		int tip;
		scanf("%d %d %d",&tip,&a,&b);
		//printf("%d %d %d\n",tip,a,b);
		if(tip==1)
		{
			pos=a;
			valoare=b;
			update(1,1,n);
		}
		else
		{
			maxim=-1;
			caut(1,1,n);
			printf("%d\n",maxim);
		}
	}
	
	
	return 0;
}