Cod sursa(job #187077)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 30 aprilie 2008 13:14:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include<stdio.h>
#define Max 500000

int Arb[Max],n,m,x,a,b,Pos,Val,inc,sf,maxim,i;

void citire();
void update(int,int,int);
void query(int,int,int);
inline int max(int a,int b){
       if (a>b) return a;
       else     return b;
}


int main(){
    citire();
    return 0;
}

void citire(){
     freopen("arbint.in","r",stdin);
     freopen("arbint.out","w",stdout);
     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,&a,&b);
         if (x==0)
         {
                  maxim=-1;
                  inc=a;sf=b;
                  query(1,1,n);
                  printf("%d\n",maxim);
         }
         else
         {
             Pos=a;Val=b;
             update(1,1,n);
         }
     }
}

void update(int nod, int left, int right){
     if (left==right)
     {
		     Arb[nod]=Val;
                     return;
     }
     int mij=(left+right)/2;
     
     if (Pos<=mij) update(2*nod,left,mij);
     else          update(2*nod+1,mij+1,right);
     
     Arb[nod]=max(Arb[2*nod],Arb[2*nod+1]);
}

void query(int nod,int left,int right) {  
     if (inc<=left && right<=sf)
     {
                   if (maxim<Arb[nod]) maxim=Arb[nod];
                   return;
     }
     int mij=(left+right)/2;
     if (inc<=mij) query(2*nod,left,mij);
     if (mij<sf)   query(2*nod+1,mij+1,right);
     
}