Cod sursa(job #334775)

Utilizator szabotamasSzabo Tamas szabotamas Data 27 iulie 2009 23:11:05
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <iostream>


using namespace std;

#define NMAX 100001
#define NMAXX 200002

long q,w,a,b,i,n,m,v[NMAX],t[NMAXX];

void build(long k, long beg, long end){
	if (beg==end){
		t[k]=v[beg];
		return;
	}
	build(2*k,beg,(beg+end)/2);
	build(2*k+1,(beg+end)/2+1,end);
	if (t[k*2]>=t[k*2+1])
		t[k]=t[k*2];
	else
		t[k]=t[k*2+1];
}

void build2(long k, long beg, long end){
	if (beg==end){
		t[k]=b;
		return;
	}
	if (a<=(beg+end)/2)
		build2(2*k,beg,(beg+end)/2);
	else
		build2(2*k+1,(beg+end)/2+1,end);
	if (t[k*2]>=t[k*2+1])
		t[k]=t[k*2];
	else
		t[k]=t[k*2+1];
}

long maxq (long k, long beg, long end){
	if (a>end || b<beg){
		return -1;
	}
	if (a<=beg && end<=b){
		return t[k];
	}
	long x=maxq(2*k,beg,(beg+end)/2);
	long y=maxq(2*k+1,(beg+end)/2+1,end);
	if (x>=y)
		return x;
	else
		return y;
}



int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w", stdout);
		scanf("%ld %ld",&n,&m);
		for (i=1; i<=n; i++){
			scanf("%ld ", &b);
			a=i;
			build2(1,1,n);
		}
		for (w=1; w<=m; w++){
			scanf ("%ld %ld %ld" ,&q,&a,&b);
			if (q==0){
				printf("%ld\n", maxq(1,1,n));
			}
			if (q==1){
				build2(1,1,n);
			}
		}
	fclose(stdin);
	fclose(stdout);
	return 0;
}