Cod sursa(job #855607)

Utilizator ioanapopaPopa Ioana ioanapopa Data 15 ianuarie 2013 11:48:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include<cstdio>
#include<cstdlib>
#define q 300003

using namespace std;

int *Arbore = (int*)malloc((q * sizeof(int)),maxim;

inline int max(int a, int b)
{
	if(a< b) return b;
		else return a;
}
inline void make(int left,int right,int nod,int pozitie,int elem)
{
	if(right==left)	
		{
			Arbore[nod]=elem;
			return;
		}
	
		int	mij=(right+left)/2;
		int aux = 2*nod;
			if(pozitie <= mij)	
			make(left,mij,aux,pozitie,elem);
			else
			make(mij+1,right,aux+1,pozitie,elem);
		
	Arbore[nod]=max(Arbore[aux],Arbore[aux+1]);
}

inline void interogare(int nod,int left, int right, int capat1, int capat2)
{
	if( left >= capat1 && right <= capat2)
	{
		if(maxim < Arbore[nod]) maxim=Arbore[nod];
		return;
	}
		int aux = 2*nod;
		int	mij=(left+right)/2;
			if(capat1<=mij) interogare(aux,left,mij,capat1,capat2);
			if(capat2>mij) interogare(aux+1,mij+1,right,capat1,capat2);
		
}
int main()
{
	int a,b,n,m,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);
			make(1,n,1,i,x);
		}
	for(int i=1;i<=m;++i)
		{
			scanf("%d%d%d",&x,&a,&b);
			if(x)
			{
				make(1,n,1,a,b);
			}
			else
			{
				maxim=-1;
				interogare(1,1,n,a,b);
				printf("%d\n",maxim);
			}
		}
		return 0;
	}