Cod sursa(job #1640297)

Utilizator gerd13David Gergely gerd13 Data 8 martie 2016 16:51:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std ;

ifstream fin("arbint.in") ;
ofstream fout("arbint.out") ;
const int NMAX = 100000005 ;
int N, Q, arb[NMAX], A[NMAX], sol ;

void Update(int left, int right, int node, int index)
{
    int middle = (left + right) / 2 ;
    if(left == right)
    {
        arb[node] = A[index] ;
        return  ;
    }
    if(index <= middle)
        Update(left, middle, 2 * node, index) ;
    else Update(middle + 1, right, 2 * node + 1, index) ;

    arb[node] = max(arb[2 * node], arb[2 * node  + 1]) ;
}

void Query(int left, int right, int node, int X, int Y)
{

    int middle = (left + right) / 2 ;

    if(left >= X && right <= Y)
    {
        sol = max(sol, arb[node]) ;
        return ;
    }

    if(X <= middle)
        Query(left, middle, 2 * node, X, Y);
    if(Y > middle)
        Query(middle + 1, right, 2 * node + 1, X, Y) ;


}

int main()
{
    fin >> N >> Q ;

    for(int i  = 1 ; i <= N ; ++ i )
    {
        fin >> A[i] ;
        Update(1, N, 1, i) ;
    }


    while(Q --)
    {
        int x, a, b;
        fin >> x >> a >> b ;
        if(!x)
        {
            sol = 0 ;
            Query(1, N, 1, a, b) ;
            fout << sol << '\n' ;
        }
        else
        {
            A[a] = b ;
            Update(1, N, 1, a) ;
        }

    }

    fin.close() ;
    fout.close() ;
    return 0 ;
}