Cod sursa(job #592657)

Utilizator galacticaBattlestar galactica Data 29 mai 2011 16:42:38
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include<stdio.h>
#define lg 100005
int n,m,init[lg],t[260000],a,b,rez;
inline int max(int aa,int bb){
	return aa>bb?aa:bb;
}
void cstr(int st,int dr,int poz){
	if(st==dr){
		init[st]=poz;
		return;
	}
	int x=(st+dr)/2;
	cstr(st,x,2*poz);
	cstr(x+1,dr,2*poz+1);
}
void update(int poz, int val){
	int x=init[poz];
	t[x]=val;
	x>>=1;
	while(x){
		t[x]=max(t[2*x],t[2*x+1]);
		x>>=1;
	}
}
void query(int st,int dr,int poz){
	if(st>b || dr<a)
		return;
	if(a<=st && dr<=b)
		rez=max(rez,t[poz]);
	else{
		if(st<dr){
			int x=(st+dr)/2;
			query(st,x,poz*2);
			query(x+1,dr,poz*2+1);
		}
	}
}
	
int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	int i,x;
	
	scanf("%d%d",&n,&m);
	cstr(1,n,1);
	for(i=1;i<=n;++i){
		scanf("%d",&x);
		update(i,x);
	}
	for(i=0;i<m;++i){
		scanf("%d%d%d",&x,&a,&b);
		if(!x){
			rez=0;
			query(1,n,1);
			printf("%d\n",rez);
		}
		else
			update(a,b);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}