Cod sursa(job #2759066)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 15 iunie 2021 10:13:53
Problema Arbori de intervale Scor 40
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <stdio.h>

#define MAX_N 100000

int v[MAX_N], aint[2 * MAX_N];

int max( int a, int b ) {
    return a > b ? a : b;
}

int init( int l, int r, int nod ) {
    int mid = (l + r) / 2;

    if ( l == r )
        aint[nod] = v[l];
    else
        aint[nod] = max( init( l, mid, nod * 2 + 1 ), init( mid + 1, r, nod * 2 + 2 ) );

    return aint[nod];
}

int query( int l, int r, int nod, int lq, int rq ) {
    int mid = (l + r) / 2;

    if ( lq <= l && r <= rq )
        return aint[nod];
    if ( l > rq || r < lq )
        return 0;
    return max( query( l, mid, nod * 2 + 1, lq, rq ), query( mid + 1, r, nod * 2 + 2, lq, rq ) );
}

int update( int l, int r, int nod, int i, int x ) {
    int mid = (l + r) / 2;

    if ( l == r )
        aint[nod] = x;
    else if ( i <= mid )
        aint[nod] = max( update( l, mid, nod * 2 + 1, i, x ), aint[nod * 2 + 2] );
    else
        aint[nod] = max( aint[nod * 2 + 1], update( mid + 1, r, nod * 2 + 2, i, x ) );
    return aint[nod];
}

int main() {
    FILE *fin, *fout;
    int n, q, tip, a, b, i;

    fin = fopen( "arbint.in", "r" );
    fscanf( fin, "%d%d", &n, &q );
    for ( i = 0; i < n; i++ )
        fscanf( fin, "%d", &v[i] );

    init( 0, n - 1, 0 );

    fout = fopen( "arbint.out", "w" );

    for ( i = 0; i < q; i++ ) {
        fscanf( fin, "%d%d%d", &tip, &a, &b );
        if ( tip == 0 )
            fprintf( fout, "%d\n", query( 0, n - 1, 0, a - 1, b - 1 ) );
        else
            update( 0, n - 1, 0, a - 1, b );
    }

    fclose( fin );
    fclose( fout );

    return 0;
}