Cod sursa(job #630448)

Utilizator tomaAndrei Toma toma Data 5 noiembrie 2011 16:21:34
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#include<vector>
#define Nmax 100001
#define max(a,b) ((a>b) ? a:b)

using namespace std;

int i,N,x,M,y,type,Max;
vector<int> H(4*Nmax);

void Update(int nod,int st,int dr,int elem,int val)
{
	if (st==dr)
	{
		H[nod]=val;
		return;
	}
	int m=(st+dr)/2;

	if (m>=elem) Update(2*nod,st,m,elem,val);
		else Update(2*nod+1,m+1,dr,elem,val);
	
	H[nod]=max(H[2*nod],H[2*nod+1]);
}

void Query(int nod,int st,int dr,int x,int y)
{
	if (x<=st&&dr<=y) 
	{
		Max=max(Max,H[nod]);
		return;
	}
	int m=(st+dr)/2;

	if (x<=m) Query(2*nod,st,m,x,y);
	if (y>m) Query(2*nod+1,m+1,dr,x,y);
}

int main()
{
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	
	scanf("%d%d",&N,&M);
	
	for (i=1;i<=N;i++)
	{
		scanf("%d",&x);
		Update(1,1,N,i,x);
	}
	for (i=1;i<=M;i++)
	{
		scanf("%d%d%d",&type,&x,&y);
		if (type==1) Update(1,1,N,x,y);
			else
			{
				Max=0;
				Query(1,1,N,x,y);
				printf("%d\n",Max);
			}
	}
	
}