Cod sursa(job #682412)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 18 februarie 2012 22:51:49
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include <cstdio>

#define file_in "arbint.in"
#define file_out "arbint.out"

int N,M,a,b,Tip;
int ai[401000];
int i,X,maxx;

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

void update(int nod, int st, int dr, int poz, int val){
	
	if (st==dr){
		ai[nod]=val;
		return ;
	}
	int mij=(st+dr)/2;
	if (poz<=mij)
		update(2*nod,st,mij,poz,val);
	else
		update(2*nod+1,mij+1,dr,poz,val);
	ai[nod]=max(ai[2*nod],ai[2*nod+1]);
}
		
void query(int nod, int st, int dr, int a, int b){
	
	if (a<=st && dr<=b){
		maxx=max(maxx,ai[nod]);
		return ;
	}
	int mij=(st+dr)/2;
	
	if (a<=mij)
		query(2*nod,st,mij,a,b);
	if (b>mij)
		query(2*nod+1,mij+1,dr,a,b);
}

int main(){
	
	freopen(file_in,"r",stdin);
	freopen(file_out,"w",stdout);
	
	scanf("%d %d", &N, &M);
	
	for (i=1;i<=N;++i){
		
		scanf("%d", &X);
		
		update(1,1,N,i,X);
	}
	
	while(M--){
		
		scanf("%d %d %d",&Tip, &a, &b);
		
		if (Tip==1){
			update(1,1,N,a,b);
		}
		else{
			maxx=0;
			query(1,1,N,a,b);
			printf("%d\n", maxx);
		}
	}
	
	return 0;
}