Cod sursa(job #367605)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 22 noiembrie 2009 20:22:46
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#define Nmax 100002

int Arbi[Nmax*4+50];
int n,i,x,y,op,max,m;

inline int Max(int x,int y){
	return x>y ? x : y;
}

void Update(int nod, int l, int r,int poz, int x){
	int m;
   if( l == r ){
   	Arbi[nod]=x;
      return;
   }
   m=l+(r-l)/2;
   if( poz <= m ) Update(nod*2,l,m,poz,x);
   else Update(nod*2+1,m+1,r,poz,x);

   Arbi[nod]=Max(Arbi[2*nod],Arbi[2*nod+1]);
}

void Query(int nod, int l, int r, int x,int y){
	int m;
   if( x<=l && r<=y ){
   	if(Arbi[nod] > max) max=Arbi[nod];
      return;
   }
   m=l+(r-l)/2;
   if(x <= m) Query(2*nod,l,m,x,y);
   if(m < y ) Query(2*nod+1,m+1,r,x,y);
}

int main(){
	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(1,1,n,i,x);
   }

   for(i=1;i<=m;++i){
   	scanf("%d%d%d",&op,&x,&y);
      if(op)
      	Update(1,1,n,x,y);
      else{
      	max=-1;
         Query(1,1,n,x,y);
         printf("%d\n",max);
      }
   }

   fclose(stdin); fclose(stdout);
   return 0;
}