Cod sursa(job #302170)

Utilizator hurrycaneBogdan Gaza hurrycane Data 8 aprilie 2009 18:25:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.99 kb
#include<cstdio>

int N;
int M;
int arb[500001];
int maxim;

int getmax(int a,int b){
	if(a<b) return b;
	return a;
}

void update(int nod,int st,int dr, int poz,int val){
	if(st==dr){
		arb[nod]=val;
	}else{
		int m=(st+dr)/2;
		if(poz<=m){
			update(2*nod,st,m,poz,val);
		}else{
			update(2*nod+1,m+1,dr,poz,val);
		}
		arb[nod]=getmax(arb[2*nod],arb[2*nod+1]);
	}
}

void search(int nod,int left,int right,int start,int finish){
	if(start<=left && right<=finish){
		if(maxim<arb[nod]) maxim=arb[nod];
	}else{
		int div=(left+right)/2;
		if(start<=div) search(2*nod,left,div,start,finish);
		if(div< finish) search(2*nod+1,div+1,right,start,finish);
	}
}

int main(){
	int t,x,y;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);


	scanf("%d %d",&N,&M);
	for(int i=1;i<=N;i++){
		scanf("%d",&t);
		update(1,1,N,i,t);
	}

	for(;M--;){
		scanf("%d %d %d",&t,&x,&y);
		if(t==0){
			maxim=-1;
			search(1,1,N,x,y);
			printf("%d\n",maxim);
		}else{
			update(1,1,N,x,y);
		}
	}

	return 0;
}