Cod sursa(job #2828596)

Utilizator LucaMihaiLM10Luca Ilie LucaMihaiLM10 Data 7 ianuarie 2022 17:23:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <stdio.h>

#define MAX_N 100000

int v[MAX_N];

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

struct AINT {
    int aint[4 * MAX_N + 1];

    void init( int nod, int l, int r ) {
        int mid;

        mid = (l + r) / 2;

        if ( l == r ) {
            aint[nod] = v[l];
            return;
        }

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

    int query( int nod, int l, int r, int lq, int rq ) {
        int mid;

        mid = (l + r) / 2;

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

    void update( int nod, int l, int r, int p, int x ) {
        int mid;

        mid = (l + r) / 2;

        if ( l > p || r < p )
            return;
        if ( l == r ) {
            aint[nod] = x;
            return;
        }

        update( nod * 2 + 1, l, mid, p, x );
        update( nod * 2 + 2, mid + 1, r, p, x );
        aint[nod] = max( aint[nod * 2 + 1], aint[nod * 2 + 2] );
    }
};

AINT arb;

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] );

    arb.init( 0, 0, n - 1 );

    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", arb.query( 0, 0, n - 1, a - 1, b - 1 ) );
        else
            arb.update( 0, 0, n - 1, a - 1, b );
    }

    fclose( fin );
    fclose( fout );

    return 0;
}