Cod sursa(job #634527)

Utilizator cristicecCristian Uricec cristicec Data 16 noiembrie 2011 17:06:55
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<stdio.h>
#include<vector>
#define NMAX 100004

using namespace std;
int n,m,arb[2*NMAX],v[NMAX];
int maxim;
int poz;
inline int max( int a, int b){
	if(a>b) return a;
	return b;
}

int add(int nod, int st, int dr){
	if(st==dr){
		arb[nod]=v[poz];
    }
	else{
		int mij=(st+dr)/2;
		if(poz<=mij)
			add(2*nod, st, mij);
		else
			add(2*nod+1,mij+1, dr);
		
		arb[nod]=max(arb[2*nod], arb[2*nod+1]);
	}
}

void max(int nod, int st, int dr, int x, int y){
	if(x<=st&&y>=dr)
		maxim=max(maxim, arb[nod]);
	else{
		int mij=(st+dr)/2;
		if(y>mij)
			max(2*nod+1, mij+1, dr, x , y);
		if(x<=mij)
			max(2*nod, st, mij, x, y );
	
	}
}
int main(){
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);
	scanf("%d%d", &n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d", &v[i]);
		poz=i;
		add(1,1,n);
	}	

	int op,a,b;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d", &op,&a,&b);
		if(op==0){
			maxim=-1;
			max(1,1,n,a,b);
		    printf("%d\n", maxim);
		}
		else
		{
		v[a]=b;
		poz=a;
		add(1,1,n);
		}
	}
return 0;
}