Cod sursa(job #778897)

Utilizator crushackPopescu Silviu crushack Data 16 august 2012 02:44:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.19 kb
#include <stdio.h>
#define NMax 100010
#define oo 2000000000
const char IN[]="arbint.in",OUT[]="arbint.out";

int N,M;
int arb[5*NMax] , v[NMax];

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

void make(int poz,int st,int dr){

	if (st==dr){
		arb[poz]=v[st];
		return;
	}
	int m=(st+dr)>>1;
	make(2*poz,st,m);
	make(2*poz+1,m+1,dr);
	arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}

void Update(int poz,int st,int dr,int x,int v){

	if (st==dr){
		arb[poz]=v;
		return;
	}
	int m=(st+dr)>>1;
	if (x<=m) Update(2*poz,st,m,x,v);
	else      Update(2*poz+1,m+1,dr,x,v);
	arb[poz]=max(arb[2*poz],arb[2*poz+1]);
}

int Query(int poz,int st,int dr,int x,int y){

	if ( x<=st && dr<=y )
		return arb[poz];
	int m=(st+dr)>>1,r=-oo,r2=-oo;

	if (x<=m) r =Query(2*poz,st,m,x,y);
	if (y >m) r2=Query(2*poz+1,m+1,dr,x,y);
	return max(r,r2);
}

int main()
{
	int i,c,x,y;
	freopen(IN,"r",stdin);
	scanf("%d%d",&N,&M);
	for (i=1;i<=N;++i) scanf("%d",v+i);
	make(1,1,N);

	freopen(OUT,"w",stdout);
	while (M--){
		scanf("%d%d%d",&c,&x,&y);
		if (!c)
			printf("%d\n",Query(1,1,N,x,y));
		else
			Update(1,1,N,x,y);
	}
	fclose(stdout);
	fclose(stdin);
	return 0;
}