Cod sursa(job #2909296)

Utilizator KarinaDKarina Dumitrescu KarinaD Data 12 iunie 2022 13:54:33
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int N = 100000;
int v[N + 1], aint[N + 1];

int query ( int q_st, int q_dr, int i, int st, int dr ) {

    if ( st == q_st && dr == q_dr )
        return aint[i];
    
    int mid = ( st + dr ) / 2;
    
    if ( mid >= q_dr )
         return query ( q_st, q_dr, i * 2 + 1, st, mid );
    else if ( q_st >= mid + 1 )
        return query ( q_st, q_dr, i * 2 + 2, mid + 1, dr );

    else
        return max ( query ( q_st, mid, i * 2 + 1, st, mid ), query ( mid + 1, q_dr, i * 2 + 2, mid + 1, dr ) );
}

void update ( int pos, int val, int i, int st, int dr ) {

    if ( st == dr ) {
        aint[i] = val;
        return;
    }

    int mid = ( st + dr ) / 2;

    if ( pos <= mid )
        update( pos, val, i * 2 + 1, st, mid );
    else
        update( pos, val, i * 2 + 2, mid + 1, dr );

    aint[i] = max ( aint[i * 2 + 1], aint[i * 2 + 2] );
}

int main () {
    
    int n, m, i, a, b, c;
    
    fin >> n >> m;
    
    for ( i = 1; i <= n; i++ ) {
        fin >> v[i];
        update ( i, v[i], 0, 1, n );
    }
    
    for ( i = 0; i < m; i++ ){
        
        fin >> c >> a >> b;
        
        if ( c == 1 )
            update ( a, b, 0, 1, n );
        else
            fout << query ( a, b, 0, 1, n ) << "\n";
    }
    
}