Cod sursa(job #557698)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 16 martie 2011 19:47:26
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>

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

void citire(){
	scanf("%d %d",&n,&m);
	int i;
	for(i=1;i<=n;i++)
		scanf("%d",&v[i]);
}

void solve(int a,int b){
	int max=-1,i;
	for(i=a;i<=b;i++)
		if(max<v[i])
			max=v[i];
	printf("%d\n",max);
}

void rezolvare1(){
	int i,x,a,b;
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&x,&a,&b);
		if(x==1)
			v[a]=b;
		else solve(a,b);
	}
}	

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 min=(st+dr)/2;
	if(poz<=min)
		update(2*nod,st,min);
	else update(2*nod+1,min,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 min=(st+dr)/2;
	if(min>=start)
		query(2*nod,st,min);
	if(min+1<=finish)
		query(2*nod+1,min+1,dr);
}
	

void rezolvare2(){
	int i,x,a,b;
	for(i=1;i<=n;i++){
		val=v[i];
		poz=i;
		update(1,1,n);
	}
	for(i=1;i<=m;i++){
		scanf("%d %d %d",&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("%d\n",valMax);
			}
	}
}

int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	citire();
	if(n<=10000 && m<=10000)
		rezolvare1();
	else rezolvare2();
	return 0;
}