Cod sursa(job #1690593)

Utilizator isa_fares_mudiFares Mohamad isa_fares_mudi Data 15 aprilie 2016 12:29:27
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <algorithm>
#include <assert.h>

const int MAX = 100000;
using namespace std;
int v[4 * MAX + 5];
int my_max;
void update ( int nod, int st, int dr, int poz, int val ) {
    if ( st == dr ) {
        v[nod] = val;
        return;
    }
    int mid = ( st + dr ) / 2;
    if ( mid < poz )
        update ( 2 * nod  + 1, mid + 1, dr, poz, val );
    else
        update ( 2 * nod, st, mid, poz, val );
    v[nod] = max ( v[2*nod], v[2*nod+1] );
}
void query ( int nod, int st, int dr, int a, int b ) {
    int mid = (st + dr) / 2;
    if ( a <= st && dr <= b ) {
        my_max = max ( my_max, v[nod] );
        return;
    }
    if ( a <= mid )
        query ( 2 * nod, st, mid, a, b );
    if ( b > mid )
        query ( 2 * nod + 1, mid + 1, dr, a, b );
}
int main() {
    freopen ( "arbint.in", "r", stdin );
    freopen ( "arbint.out", "w", stdout );
    int n, m, i, op, x, y;
    scanf ( "%d%d", &n, &m );
    for ( i = 1 ; i <= n ; ++ i ) {
        scanf ( "%d", &x );
        update ( 1, 1, n, i, x );
    }
    for( i = 1 ; i <= m ; i ++ ) {
        scanf ( "%d%d%d", &op, &x, &y );
        if ( op == 0 ) {
            my_max = 0;
            query ( 1, 1, n, x, y );
            printf ("%d\n", my_max );
        }
        else
            update ( 1, 1, n, x, y );
    }
    return 0;
}