Cod sursa(job #762291)

Utilizator VladberilaVladutz Vladberila Data 29 iunie 2012 17:48:19
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include <cstdio>
#define maxn 100001
FILE *f = fopen("arbint.in","r");
FILE *g = fopen("arbint.out","w");
int arb[4*maxn],m,n,a[maxn],maxi;

inline int maxim(int a,int b){
	
	return a>b?a:b;
}

void insert(int nod,int poz,int cap_st,int cap_dr,int val){
	
	if(cap_st==cap_dr){
		
		arb[nod] = val;
		return;
	}
	int mij = (cap_st+cap_dr)/2;
	if(poz<=mij)
		insert(2*nod,poz,cap_st,mij,val);
	else
		insert(2*nod+1,poz,mij+1,cap_dr,val);
	arb[nod] = maxim(arb[2*nod],arb[2*nod+1]);
}

int query(int nod,int cap_st,int cap_dr,int A,int b){
	
	if(cap_st>=A && b>=cap_dr){
		
		if(arb[nod]>maxi)
			maxi = arb[nod];
		return maxi;
	}
	int mij = (cap_st+cap_dr)/2;
	if(A<=mij)
		return query(2*nod,cap_st,mij,A,b);
	if(b>mij)
		return query(2*nod+1,mij+1,cap_dr,A,b);
	
}

void solve(){
	
	fscanf(f,"%d%d",&n,&m);
	int i,x,A,b;
	for(i=1;i<=n;i++){
		
		fscanf(f,"%d",&a[i]);
		insert(1,i,1,n,a[i]);
	}
	for(i=1;i<=m;i++){
		
		fscanf(f,"%d%d%d",&x,&A,&b);
		if(x==1){
			
			a[A]=b;
			insert(1,A,1,n,b);
		}
		else{
			maxi = -1;
			fprintf(g,"%d\n",query(1,1,n,A,b));
		}
	}
}

int main(){
	
	solve();
	fclose(f);
	fclose(g);
	return 0;
}