Cod sursa(job #195735)

Utilizator Matei14Popa-Matei Mihai Matei14 Data 21 iunie 2008 11:29:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <stdio.h>  
#define N 100005
int n,m;
int a[4*N+66];
int s, f, v, p, maxim;
inline int max(int a,int b){
	if(a>b)
		return a;
	return b;
}
void Update(int nod,int l,int r){
	if(l==r){
		a[nod]=v;
		return;
	}
	int d=(l+r)/2;
	if(p<=d)
		Update(2*nod,l,d);
	else
		Update(2*nod+1,d+1,r);
	a[nod]=max(a[2*nod],a[2*nod+1]);
}
void Query(int nod, int l, int r){
	if(s<=l&&r<=f){
		if(maxim<a[nod])
			maxim=a[nod];
		return;   
	}
	int d=(l+r)/2;
	if(s<=d)
		Query(2*nod,l,d);
	if(f>d)
		Query(2*nod+1,d+1,r);
}
int main(){
    int X,A,B,i;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d", &n, &m);
    for(i=1;i<=n;++i){
        scanf("%d", &X);
        p=i, v=X;
        Update(1,1,n);
    }
    for(i=1;i<=m;++i){
        scanf("%d%d%d",&X,&A,&B);
        if(X==0){
			maxim=-1;
			s=A,f=B;
			Query(1,1,n);
			printf("%d\n", maxim);
        }
        else{
            p=A, v=B;
            Update(1,1,n);
        }
    }
}