Cod sursa(job #855464)

Utilizator ioanapopaPopa Ioana ioanapopa Data 14 ianuarie 2013 23:33:19
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<cstdio>
#include<cstdlib>
#define q 100001
using namespace std;
int Arbore[2*q+1],maxim,pozitie,x,aux,capat1,capat2;
inline int max(int a, int b)
{
	if(a<=b) return b;
		else return a;
}
inline void make(int left,int right,int nod)
{
	if(right==left)	
		{
			Arbore[nod]=aux;
			return;
		}
	
		int	mij=(right+left)/2;
			if(pozitie <= mij)	
			make(left,mij,2*nod);
			else
			make(mij+1,right,2*nod+1);
		
	Arbore[nod]=max(Arbore[2*nod],Arbore[2*nod+1]);
}

inline void interogare(int nod,int left, int right)
{
	if( left >= capat1 && right <= capat2)
	{
		if(maxim < Arbore[nod]) maxim=Arbore[nod];
		return;
	}
		int	mij=(left+right)/2;
			if(capat1<=mij) interogare(2*nod,left,mij);
			if(capat2>mij) interogare(2*nod+1,mij+1,right);
		
}
int main()
{
	int a,b,n,m;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	scanf("%d%d",&n,&m);
	for(int i=1;i<n+1;++i)
		{	
			scanf("%d",&x);
			pozitie=i;
			aux = x;
			make(1,n,1);
		}
	for(int i=1;i<m+1;++i)
		{
			scanf("%d%d%d",&x,&a,&b);
			if(x==1)
			{
				pozitie=a;
				aux=b;
				make(1,n,1);
			}
			else if(x==0)
			{
				maxim=-1;
				capat1 = a;
				capat2 = b;
				interogare(1,1,n);
				printf("%d\n",maxim);
			}
		}
		return 0;
	}