Cod sursa(job #705243)

Utilizator ion824Ion Ureche ion824 Data 3 martie 2012 19:30:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include<cstdio>
#define nmax 100005
int arb[4*nmax+50],maxim,pos,start,finish,val;

void update(int nod,int left,int right){
     if( left==right){
         arb[nod]=val;
         return ;
         }
     int div=(left+right)/2;
     if(pos<=div)update(2*nod,left,div);
            else update(2*nod+1,div+1,right);
     if(arb[2*nod]>arb[2*nod+1])arb[nod]=arb[2*nod];
                           else arb[nod]=arb[2*nod+1];
     }

void query(int nod,int left,int right){
     if( start<=left && right<=finish ){
         if(maxim<arb[nod])maxim=arb[nod];
         return ;         
         }
     int div=(left+right)/2;
     if(start<=div)query(2*nod,left,div);
     if(div<finish)query(2*nod+1,div+1,right);    
     }

int main(void){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    int n,m,x,i;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i){
            scanf("%d",&x);
            pos = i; val = x;
            update(1,1,n);            
            }
    for(i=1;i<=m;++i){
            scanf("%d%d%d",&x,&start,&finish);          
            if(x){
                  pos = start; val = finish;
                  update(1,1,n);
                  }
               else{
                    maxim=-1;
                    query(1,1,n);   
                    printf("%d\n",maxim);          
                      }
               }          
  return 0;  
}