Cod sursa(job #2586639)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 21 martie 2020 12:17:32
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>

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

const int NMAX  = 100000;
const int INF = 1<<30;

class Aint {
    private : int aint[1 + 4 * NMAX];
    public :
        Aint(){};
        ~Aint(){};
        void update ( int p, int poz, int val, int left, int right );
        int query ( int p, int b, int e, int left, int rigth );
}; 

void Aint::update ( int p, int poz, int val, int left, int right ) {
    if ( left == right  ) {
        aint[p] = val;
        return ;
    }
    int mid = ( left + right ) / 2;
    if ( poz <= mid ) 
        update ( 2 * p, poz, val, left, mid );
    else
        update ( 2 * p + 1, poz, val, mid + 1, right );
    aint[p] = std::max ( aint[2 * p], aint[2 *p + 1] );
}

int Aint::query ( int p, int b, int e, int left, int right ) {
    if ( b <= left && right <= e )
        return aint[p];
    int mid = ( left + right ) / 2;
    int ans1 = -INF, ans2 = -INF;
    if ( b <= mid ) 
        ans1 = query ( 2 * p, b, e, left, mid );
    if ( e > mid )
        ans2 = query ( 2 * p + 1, b, e, mid + 1, right );
    return std::max ( ans1, ans2 );
}

int main() {

    int N, M;
    Aint aint = Aint();

    fin >> N >> M;

    for ( int i = 1; i <= N; ++i ) {
        int x;
        fin >> x;
        aint.update ( 1, i, x, 1, N );
    }
    
    for ( int i = 1; i <= M; ++i ) {
        int op, a, b;
        fin >> op >> a >> b;
        if ( op == 0 )
            fout << aint.query ( 1, a, b, 1, N ) << '\n';
        else
            aint.update ( 1, a, b, 1, N );
    }

    fin.close();
    fout.close();

    return 0;
}