Cod sursa(job #368719)

Utilizator titusuTitus C titusu Data 25 noiembrie 2009 17:47:03
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 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 ;

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

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

}


int  Query(int nod, int st, int dr, int a, int b){
	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,a,b);
		if(b>mijloc)
			m2 = Query(2*nod+1,mijloc+1,dr,a,b);
		return Maxim(m1,m2);
	}

}

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

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