Cod sursa(job #3221243)

Utilizator andreidumitrache1709Dumitrache Andrei Bogdan andreidumitrache1709 Data 6 aprilie 2024 13:13:18
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.62 kb
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100000
int v[MAXN + 1];
int aint[MAXN * 4 + 1];
void build( int l , int r , int node ) {
    if( l != r ) {
        int mid = ( l + r ) / 2;
        build( l , mid , 2 * node );
        build( mid + 1 , r , 2 * node + 1 );
        aint[node] = max( aint[2 * node] , aint[2 * node + 1] );
    } else
        aint[node] = v[l];
}
void update( int node , int l , int r , int pos , int val ) {
    int mid = ( l + r ) / 2;
    if( l == r ) {
        aint[node] = val;
        return;
    }
    if( mid >= pos )
        update( node * 2 , l , mid , pos , val );
    else
        update( node * 2 + 1 , mid + 1 , r , pos , val );
    aint[node] = max( aint[node * 2] , aint[node * 2 + 1] );
}
int query( int node , int from , int to , int l , int r ) {
    int ans = 0;
    if( l <= from && to <= r )
        return aint[node];
    int mid = ( from + to ) / 2;
    if( l <= mid ) {
        int s = query( node * 2 , from , mid , l , r );
        ans = max( ans , s );
    }
    if( mid + 1 <= r ) {
        int s = query( 2 * node + 1 , mid + 1 , to , l , r );
        ans = max( ans , s );
    }
    return ans;
}
int main() {
    ifstream cin( "arbint.in" );
    ofstream cout( "arbint.out" );
    int l , r , a , b , tip , n , q , i;
    cin >> n >> q;
    for( i = 1 ; i <= n ; i++ )
        cin >> v[i];
    build( 1 , n , 1 );
    for( i = 0 ; i < q ; i++ ) {
        cin >> tip >> a >> b;
        if( tip == 0 )
            cout << query( 1 , 1 , n , a , b ) << '\n';
        else
            update( 1 , 1 , n , a , b );
    }
    return 0;
}