Cod sursa(job #688753)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 23 februarie 2012 20:04:50
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include<stdio>   
#include <iostream>
#define lg 100005   
using namespace std;
int n,m,init[lg],t[4*lg+200],a,b,rez;   
inline int max(int aa,int bb){   
    return aa>bb?aa:bb;   
}   

// vectorul init
void construiesc(int st,int dr,int poz){   
    if(st==dr){   
        init[st]=poz;   
      
        return;   
    }   
    int x=(st+dr)/2;   
    construiesc(st,x,2*poz);   
    construiesc(x+1,dr,2*poz+1);   
}   

//***************ACTUALIZARE
void actualizez(int poz, int val){   
    int x=init[poz];   
    t[x]=val;   
    x>>=1;   
    while(x){   
        t[x]=max(t[2*x],t[2*x+1]);   
        x>>=1;   
    }   
}  

//************INTEROGARE   
void interogare(int st,int dr,int poz){   
    if(st>b || dr<a)   
        return;   
    if(a<=st && dr<=b)   
        rez=max(rez,t[poz]);   
    else{   
        if(st<dr){   
            int x=(st+dr)/2;   
            interogare(st,x,poz*2);   
            interogare(x+1,dr,poz*2+1);   
        }   
    }   
}   
       
int main(){   
    freopen("arbint.in","r",stdin);   
    freopen("arbint.out","w",stdout);   
    int i,x;   
       
    scanf("%d%d",&n,&m);   
    construiesc(1,n,1);  
    printf("\n");

    
   
   //*************CITIRE ELEMENTE
    for(i=1;i<=n;++i){   
        scanf("%d",&x);   
        actualizez(i,x);   
    }   
    
//****************EFECTUARE TESTE
    for(i=0;i<m;++i){   
        scanf("%d%d%d",&x,&a,&b);   
        if(!x){   
            rez=0;   
            interogare(1,n,1);   
            printf("%d\n",rez);   
        }   
        else  
            actualizez(a,b);   
    }   
    printf("\n");
    fclose(stdin);   
    fclose(stdout);   
    
      

    return 0;   
}