Cod sursa(job #201810)

Utilizator nusmaibunkeleviprofesor cicalescu nusmaibunkelevi Data 4 august 2008 10:37:46
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include<stdio.h>

#define NMAX 100000
#define MMAX 3*NMAX

int max;

void qry(int nod,int ls,int ld,int a,int b,int x[]){
int mij;
if(a<=ls&&ld<=b){
	if(max<x[nod]) max=x[nod];
	}
else{
	mij=(ls+ld)/2;
	if(a<=mij) qry(nod*2,ls,mij,a,b,x);
	if(mij<b) qry(nod*2+1,mij+1,ld,a,b,x);
	}
}


int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m,i,j,k,v[NMAX+1]={0},w[MMAX+1]={0},tip,a,b;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++) scanf("%d",&v[i]);
int ii,jj,mij;

for(i=1;i<=n;i++){
	ii=1;jj=n;k=1;
	while(ii<=jj){
		if(ii==jj) {
			w[k]=v[i];
			k=k/2;
			while(k){
				if(k)
					if(w[2*k]>w[2*k+1]) w[k]=w[2*k];
					else w[k]=w[2*k+1];
				k/=2;
				}
			break;
			}
		else{
			mij=(ii+jj)/2;
			if(i<=mij){
				k=2*k;jj=mij;
				}
			else{
				k=2*k+1;ii=mij+1;
				}
			}
		}
	}

for(j=0;j<m;j++){
	scanf("%d%d%d",&tip,&a,&b);
	if(tip==0){
		max=0;
		qry(1,1,n,a,b,w);
		printf("%d\n",max);
		}
	else{
		ii=1;jj=n;k=1;
		while(ii<=jj){
			if(ii==jj) {
				w[k]=b;
				k=k/2;
				while(k){
					if(k)
						if(w[2*k]>w[2*k+1]) w[k]=w[2*k];
						else w[k]=w[2*k+1];
					k/=2;
					}
				break;
				}
			else{
				mij=(ii+jj)/2;
				if(a<=mij){
					k=2*k;jj=mij;
					}
				else{
					k=2*k+1;ii=mij+1;
					}
				}
			}
		v[a]=b;
		}
	}
return 0;
}