Cod sursa(job #200175)

Utilizator maria_pparcalabescu maria daniela maria_p Data 22 iulie 2008 15:59:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
long a[100010],arb[400010],n,m,i,x,y,c;
long max(long a,long b){
	if(a>b)return a;
	else return b;
}
void init(long nod,long st,long dr){
	long mij;
	if(st==dr){
		arb[nod]=a[st];
		return;
	}
	mij=(st+dr)/2;
	init(2*nod+1,st,mij);
	init(2*nod+2,mij+1,dr);
	arb[nod]=max(arb[2*nod+1],arb[2*nod+2]);
}
long query(long nod,long st,long dr){
	long maxim,mij;
	if(x<=st && y>=dr)
		return arb[nod];
	maxim=-1;
	mij=(st+dr)/2;
	if(x<=mij)
		maxim=max(maxim,query(2*nod+1,st,mij));
	if(y>=mij+1)
		maxim=max(maxim,query(2*nod+2,mij+1,dr));
	return maxim;
}
void update(long nod,long st,long dr){
	long mij;
	/*if(a[x]>arb[nod])
		arb[nod]=a[x];*/
	if(st==dr){
		arb[nod]=a[x];
		return;
	}
	mij=(st+dr)/2;
	if(x<=mij)
		update(2*nod+1,st,mij);
	if(x>=mij+1)
		update(2*nod+2,mij+1,dr);
	arb[nod]=max(arb[2*nod+1],arb[2*nod+2]);
}
int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%ld%ld",&n,&m);
	for(i=0;i<n;i++)
		scanf("%ld",&a[i]);
	init(0,0,n-1);
	for(i=0;i<m;i++){
		scanf("%ld%ld%ld",&c,&x,&y);
		if(c==0){
			x=x-1;y=y-1;
			printf("%ld\n",query(0,0,n-1));
		}
		else{
			x=x-1;
			a[x]=y;
			update(0,0,n-1);
		}
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}