Cod sursa(job #1258677)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 9 noiembrie 2014 11:05:55
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>

using namespace std;

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

const int nmax = 100000;
int ans, upoz;
int ai[ 4 * nmax + 1 ];

inline int max2( int x, int y ) {
    if ( x < y ) {
        return y;
    } else {
        return x;
    }
}
void update( int st, int dr, int poz, int x ) {
    int mid;
    if ( st == dr ) {
        ai[ poz ] = x;
        return ;
    }
    mid = ( st + dr ) / 2;
    if ( mid < upoz ) {
        update( mid + 1, dr, 2 * poz + 1, x );
    } else {
        update( st, mid, 2 * poz, x );
    }
    ai[ poz ] = max2( ai[ 2 * poz ], ai[ 2 * poz + 1 ] );
}
void query( int stp, int drp, int st, int dr, int poz ) {
    if ( stp <= st && dr <= drp ) {
        ans = max2( ans, ai[ poz ] );
        return ;
    }
    int mid = ( st + dr ) / 2;
    if ( mid >= stp ) {
        query( stp, drp, st, mid, 2 * poz );
    }
    if ( mid + 1 <= drp ) {
        query( stp, drp, mid + 1, dr, 2 * poz + 1 );
    }
}
int main() {
    int n, m, x, y, k;
    fin >> n >> m;
    for( int i = 1; i <= n; ++ i ) {
        fin >> x;
        upoz = i;
        update( 1, n, 1, x );
    }
    for( int i = 0; i < m; ++ i ) {
        fin >> k >> x >> y;
        if ( k == 1 ) {
            upoz = x;
            update( 1, n, 1, y );
        } else {
            ans = -1 << 30;
            query( x, y, 1, n, 1 );
            fout << ans << "\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}