Cod sursa(job #557721)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 16 martie 2011 20:07:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include <cstdio>

int n,m,arbMax[400006],val,poz,valMax,start,finish;

void citire(){
	scanf("%ld %ld",&n,&m);
}

int maxim(int a,int b){
	if(a>b)
		return a;
	else return b;
}

void update(int nod,int st,int dr){
	if(st==dr){
		arbMax[nod]=val;
		return;
	}
	int minim=(st+dr)/2;
	if(poz<=minim)
		update(2*nod,st,minim);
	else update(2*nod+1,minim+1,dr);
	arbMax[nod]=maxim(arbMax[2*nod],arbMax[2*nod+1]);
}	

void query(int nod,int st,int dr){
	if(start<=st && dr<=finish){
		if(valMax<arbMax[nod])
			valMax=arbMax[nod];
		return;
	}
	int minim=(st+dr)/2;
	if(minim>=start)
		query(2*nod,st,minim);
	if(minim+1<=finish)
		query(2*nod+1,minim+1,dr);
}
	

void rezolvare2(){
	int i,x,a,b;
	for(i=1;i<=n;i++){
		scanf("%ld",&x);
		val=x;
		poz=i;
		update(1,1,n);
	}
	for(i=1;i<=m;i++){
		scanf("%ld %ld %ld",&x,&a,&b);
			if(x==1){
				val=b;
				poz=a;
				update(1,1,n);
			}
			else {
				start=a;
				finish=b;
				valMax=-1;
				query(1,1,n);
				printf("%ld\n",valMax);
			}
	}
}

int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	citire();
	rezolvare2();
	return 0;
}