Cod sursa(job #1752246)

Utilizator bogdanluncasubogdan bogdanluncasu Data 3 septembrie 2016 12:40:17
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <iostream>
using namespace std;
int a[400001],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;}
	
	if(start<=(n+s)/2){
		getMax(2*nod,s,(n+s)/2);
	}
	if((n+s)/2<_end){
		getMax(2*nod+1,((n+s)/2)+1,n);
	}

}
int max(int a,int b){return (a>b)?a:b;}
void update(int nod,int s,int n){
	
	if(s==n){a[nod]=val;return;}
	int mij=(n+s)/2;
	if(pos<=mij){
		update(2*nod,s,mij);
	}else{
		update(2*nod+1,mij+1,n);
	}
	//cout<<a[2*nod]<<" "<<a[2*nod+1]<<endl;
	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=1;i<4*n+4;i++)cout<<"Nod "<<i<<" "<<a[i]<<endl;
	for(int i=0;i<m;i++){
		scanf("%d %d %d",&d,&b,&c);
		if(d==0){
			start=b;_end=c;
			//cout<<"Interval "<<b<<" "<<c<<endl;
			getMax(1,1,n);
			printf("%d\n",_max);
			_max=-2e9;
		}
		else{
			pos=b;val=c;
		 	update(1,1,n);
		 	//for(int i=1;i<4*n;i++)cout<<"Nod "<<i<<" "<<a[i]<<endl;
		}
	}

	
}