Cod sursa(job #1458529)

Utilizator cristina_borzaCristina Borza cristina_borza Data 7 iulie 2015 18:40:21
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n , m , v[800001] , a , b , sol[800001] , tip;

void pr(int inc , int sf , int nr) ;
int solve(int inc , int sf , int nr) ;
void update(int inc , int sf ,int nr) ;

int main()
{
    f >> n >> m ;
    for(int i = 1 ; i <= n ; ++i){
        f >> v[i] ;
    }

    pr(1 , n , 1) ;

    for(int i = 1 ; i <= m ; ++i){
        f >> tip >> a >> b ;
        if(tip == 0)
            g << solve(1 , n , 1) << '\n';
        else{
            update(1 , n , 1) ;
        }
    }
    return 0;
}

void pr(int inc , int sf , int nr){
    if(inc == sf){
        sol[nr] = v[inc] ;
        return ;
    }
    pr(inc , (inc + sf)/2 , nr * 2);
    pr((inc + sf) / 2 + 1 , sf , nr * 2 + 1) ;
    sol[nr] = max(sol[nr * 2] , sol[nr * 2 + 1]) ;
}

int solve(int inc , int sf , int nr){
    int mij = (inc + sf) / 2 ;
    if(a <= inc && b >= sf){
        return sol[nr];
    }
    if(b <= mij){
        return solve(inc , mij , 2 * nr) ;
    }
    if(a > mij){
        return solve(mij + 1 , sf , 2 * nr + 1) ;
    }
    if(a <= mij && mij <= b)
        return max(solve(inc , mij , 2 * nr) , solve(mij + 1 , sf , 2 * nr + 1));
}

void update(int inc , int sf , int nr){
    int mij = (inc + sf) / 2;
    if(inc == sf && inc == a){
        sol[nr] = b ;
        return ;
    }
    if(a <= mij)
        update(inc , (inc + sf)/2 , nr * 2);
    else
        update((inc + sf) / 2 + 1 , sf , nr * 2 + 1) ;
    sol[nr] = max(sol[nr * 2] , sol[nr * 2 + 1]) ;
}