Cod sursa(job #1752256)

Utilizator bogdanluncasubogdan bogdanluncasu Data 3 septembrie 2016 12:54:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.93 kb
#include <iostream>
int a[400000],n,pos,val,start,_end,_max=-2e9;
void getMax(int nod,int s,int n){
	if(start<=s&&n<=_end){if(_max<a[nod])_max=a[nod];return;}
	int mij=(n+s)>>1;
	if(start<=mij){
		getMax(2*nod,s,mij);
	}
	if((n+s)/2<_end){
		getMax(2*nod+1,mij+1,n);
	}
}
int max(int a,int b){return (a>b)?a:b;}
void update(int nod,int s,int ns){
	if(s==ns){a[nod]=val;return;}
	int mij=(ns+s)>>1;
	if(pos<=mij){
		update(2*nod,s,mij);
	}else{
		update(2*nod+1,mij+1,ns);
	}
	a[nod]=max(a[2*nod],a[2*nod+1]);
}
int main() {
	freopen("arbint.in", "r", stdin);
	freopen("arbint.out", "w", stdout);
	int m,d,b,c;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&d);pos=i,val=d;
		update(1,1,n);
	}
	for(int i=0;i<m;i++){
		scanf("%d %d %d",&d,&b,&c);
		if(d==0){
			start=b;_end=c;
			getMax(1,1,n);
			printf("%d\n",_max);
			_max=-2e9;
		}
		else{
			pos=b;val=c;
		 	update(1,1,n);
		}
	}

	
}