Cod sursa(job #183723)

Utilizator nimeniaPaul Grigoras nimenia Data 22 aprilie 2008 15:16:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <stdio.h>

const int NMAX=100001;

inline int stanga(int i) {return 2*i;}
inline int dreapta(int i){return 2*i+1;}

int Arb[5*(NMAX+1)+1];
int n,m,x,max_aux;

void update(int,int,int,int,int);
void query(int,int,int,int,int);

int main(){
	int i,a,b;
	freopen("arbint.in","r",stdin);
	freopen("arbint.out","w",stdout);

	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++) scanf("%d",&x),update(i,x,1,1,n);
	int j;

	for (i=1;i<=m;i++){
		scanf("%d%d%d",&x,&a,&b);
		if (x==0){
			max_aux=-1;
			query(1,1,n,a,b);
			printf("%d\n",max_aux);
			}else update(a,b,1,1,n);
		}

	return 0;



}

void update(int poz,int val,int i,int st,int dr){
	if (st==dr) {Arb[i]=val;return;}

	int mid=(st+dr)/2;
	if (poz<=mid) update(poz,val,stanga(i),st,mid);
	else update(poz,val,dreapta(i),mid+1,dr);

	if (Arb[stanga(i)]<Arb[dreapta(i)]) Arb[i]=Arb[dreapta(i)];
	else Arb[i]=Arb[stanga(i)];
}

void query(int i,int st,int dr,int a,int b){
	if (st>=a && dr<=b){
		if (max_aux<Arb[i]) max_aux=Arb[i];
		return;
	}
	int mid=(st+dr)/2;
	if (a<=mid) query(stanga(i),st,mid,a,b);
	if (mid<b) query(dreapta(i),mid+1,dr,a,b);

}