Cod sursa(job #3258997)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 24 noiembrie 2024 16:54:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.75 kb
#include <stdio.h>
 
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize ("unroll-loops")
 
static inline int min( int a, int b ) {
    return ( a <= b ? a : b );
}
 
static inline int max( int a, int b ) {
    return ( a >= b ? a : b );
}
 
FILE *fin;
 
int poz, valBuff;
static char buff[ ( 1 << 7 ) ];
static inline char nextChar() {
    if( poz == valBuff ) {
        fread( buff, 1, valBuff, fin );
        poz = 0;
    }
 
    return buff[ poz++ ];
}
 
static bool f[ 100 ];
static inline int readInt() {
    int rez = 0;
    int ch;
 
    while( !f[ ch = nextChar() ] );
    do
        rez = rez * 10 + ch - '0';
    while( f[ ch = nextChar() ] );
 
    return rez;
}
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int tree[ 400000 ];
int v[ 100010 ];
int n;

void makeTree( int poz, int left, int right ) {
    if( left == right )
        tree[ poz ] = v[ right ];
    else {
        int med = ( left + right ) >> 1;
        int R = poz + 2 * ( med - left + 1 );
        int L = poz + 1;

        makeTree( L, left, med );
        makeTree( R, med + 1, right );

        tree[ poz ] = max( tree[ L ], tree[ R ] );
    }
}

void update( int poz, int left, int right, int target, int val ) {
    if( left == right )
        tree[ poz ] = val;
    else {
        int med = ( left + right ) >> 1;
        int R = poz + 2 * ( med - left + 1 );
        int L = poz + 1;

        if( target <= med )
            update( L, left, med, target, val );
        else update( R, med + 1, right, target, val );

        tree[ poz ] = max( tree[ L ], tree[ R ] );
    }
}

int query( int poz, int left, int right, int a, int b ) {
    if( a <= left && right <= b )
        return tree[ poz ];

    int med = ( left + right ) >> 1;
    int R = poz + 2 * ( med - left + 1 );
    int L = poz + 1;

    int ans = 0;
    if( a <= med )
        ans = query( L, left, med, a, b );
    if( med < b )
        ans = max( ans, query( R, med + 1, right, a, b ) );

    return ans;
}
 
int main() 
{   
    f[ '0' ] = f[ '1' ] = f[ '2' ] = f[ '3' ] = f[ '4' ] = 1;
    f[ '6' ] = f[ '7' ] = f[ '8' ] = f[ '9' ] = f[ '5' ] = 1;
    valBuff = sizeof( buff );

    fin = fopen( "arbint.in", "r" );
    fread( buff, 1, valBuff, fin );

    n = readInt();
    int q = readInt();

    for( int i = 0; i < n; i++ )
        v[ i ] = readInt();

    makeTree( 0, 0, n - 1 );

    int a, b, cerinta;
    FILE *fout = fopen( "arbint.out", "w" );
    while( q-- ) {
        cerinta = readInt();
        a = readInt();
        b = readInt();

        if( cerinta == 1 )
            update( 0, 0, n - 1, a - 1, b );
        else fprintf( fout, "%d\n", query( 0, 0, n - 1, a - 1, b - 1 ) );
    }

    fclose( fin );
    fclose( fout );
    return 0;
}