Cod sursa(job #368727)

Utilizator titusuTitus C titusu Data 25 noiembrie 2009 17:59:53
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <cstdio>
struct interval{
	int st,dr;
	int valoare;
};
inline int Maxim(int a , int b){return a<b?b:a;}
int Arbore[1<<18], n, pos, valoare,a,b ;

void Update(int nod, int st, int dr){
	if(st == dr)
		Arbore[nod]  = valoare;
	else{
		int mijloc = (st+dr)/2;
		if(pos<=mijloc)
			Update(2*nod, st, mijloc);
		else
			Update(2*nod +1, mijloc+1, dr );
		Arbore[nod] = Maxim(Arbore[2*nod], Arbore[2*nod+1]);

	}
}

int  Query(int nod, int st, int dr){
	if( a<=st && dr<=b)
		return Arbore[nod];
	else{
		int mijloc = (st+dr)/2, m1,m2;
		m1=m2=-1;
		if(a<=mijloc)
			m1 = Query(2*nod, st,mijloc);
		if(b>mijloc)
			m2 = Query(2*nod+1,mijloc+1,dr);
		return Maxim(m1,m2);
	}

}

int main(){
	FILE *f = fopen("arbint1.in","r");
	int m;
	fscanf(f,"%d%d", &n,&m);
	int x;
	for(int i=1;i<=n;i++){
		fscanf(f,"%d", &x);
		pos = i, valoare = x;
		Update(1,1,n);
	}
	FILE *g = fopen("arbint.out","w");
	for( ; m ; --m){
		int op;
		fscanf(f,"%d%d%d", &op,&a,&b);
		if(op == 0){
			fprintf(g,"%d\n", Query(1,1,n));
		}
		else{
			pos=a,valoare=b;
			Update(1,1,n);
		}
	}

//	for(int i=1;i<=2*n;i++)
//		printf("%d ",Arbore[i]);
	return 0;
}