Cod sursa(job #2815182)

Utilizator Victor2006Nicola Victor-Teodor Victor2006 Data 9 decembrie 2021 11:30:35
Problema Arbori de intervale Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.52 kb
#include <stdio.h>
#include <algorithm>
#define N 100000
#define INF 1000000000
#define QUERY 0
#define UPDATE 1

using std::max;

struct intv {
    int low;
    int high;
};

int aint[N * 2];
int v[N];
int n;

int getLeftSon( int node ) { return node + 1; }
int getRightSon( int node, intv interv ) {
    int middle = (interv.low + interv.high) / 2;
    return node + (middle - interv.low + 1) * 2;
}

void build( int node, intv intvNode ) {
    if ( intvNode.low == intvNode.high ) {
        aint[node] = v[intvNode.low];
        return;
    }

    int leftSon = getLeftSon( node ), rightSon = getRightSon( node, intvNode );
    int middle = (intvNode.low + intvNode.high) / 2;

    build( leftSon, { intvNode.low, middle } );
    build( rightSon, { middle + 1, intvNode.high } );

    aint[node] = max( aint[leftSon], aint[rightSon] );
}

void update( int node, intv intvNode, int poz, int val ) {
    if ( intvNode.low == intvNode.high ) {
        aint[node] = v[intvNode.low] = val;
        return;
    }

    int leftSon = getLeftSon( node ), rightSon = getRightSon( node, intvNode );
    int middle = (intvNode.low + intvNode.high) / 2;

    if ( poz <= middle )
        update( leftSon, { intvNode.low, middle }, poz, val );
    else
        update( rightSon, { middle + 1, intvNode.high }, poz, val );

    aint[node] = max( aint[leftSon], aint[rightSon] );
}

int query( int node, intv intvNode, intv intvQ ) {
    if ( intvNode.low == intvNode.high )
        return aint[node];

    int leftSon = getLeftSon( node ), rightSon = getRightSon( node, intvNode );
    int middle = (intvNode.low + intvNode.high) / 2, ans = -INF;

    if ( intvQ.low <= middle )
        ans = max( ans, query( leftSon, { intvNode.low, middle }, intvQ ) );
    if ( middle + 1 <= intvQ.high )
        ans = max( ans, query( rightSon, { middle + 1, intvNode.high }, intvQ ) );

    return ans;
}

int main() {
    FILE *fin, *fout;
    int q, pb, a, b;

    fin = fopen( "arbint.in", "r" );
    fout = fopen( "arbint.out", "w" );
    fscanf( fin, "%d%d", &n, &q );
    for ( int i = 0; i < n; i ++ )
        fscanf( fin, "%d", &v[i] );
    build( 0, { 0, n - 1 } );
    for ( int i = 0; i < q; i ++ ) {
        fscanf( fin, "%d%d%d", &pb, &a, &b );
        if ( pb == UPDATE )
            update( 0, { 0, n - 1 }, a - 1, b );
        else if ( pb == QUERY )
            fprintf( fout, "%d\n", query( 0, { 0, n - 1 }, { a - 1, b - 1 } ) );
    }
    fclose( fin );
    fclose( fout );
    return 0;
}