Cod sursa(job #1622050)

Utilizator gerd13David Gergely gerd13 Data 1 martie 2016 00:22:21
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>

using namespace std;

const int NMAX = 10077777 ;


ifstream fin("arbint.in") ;
ofstream fout("arbint.out") ;

int arb[NMAX], A[NMAX] ;
int N, Q, result ;

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

    int middle = (left + right) / 2 ;

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

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


void Update(int left, int right, int node, int pos)
{
    int middle = (left + right) / 2 ;

    if(left == right)
    {
        arb[node] = A[pos] ;
        return ;
    }

    if(pos <= middle)
        Update(left, middle, 2 * node, pos) ;
    else
        Update(middle + 1, right, 2 * node  + 1, pos) ;

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

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

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


        while(Q -- )
    {

        int tip, a, b ;
        fin >> tip >> a >> b ;
        if(tip == 0)
        {
            result = 0  ;
            Query(1, N, 1, a, b) ;
            fout << result <<'\n';
        }
        else
        {
            A[a] = b ;
            Update(1, N, 1, a) ;
        }
    }

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