Cod sursa(job #1181620)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 3 mai 2014 13:03:48
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <cstdio>
#define MAXN 100001

int v[MAXN];

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

class SegmentTree {
    public:

    int size;
    int nodes[3*MAXN];

    void Build( int node, int left, int right ) {
        if( left == right ) { //interval elementar
            nodes[node] = v[left];
            return;
        }

        int mid = ( left + right ) >> 1;

        Build( node << 1, left, mid );
        Build( ( node << 1 ) + 1, mid + 1, right );

        nodes[node] = maximum( nodes[node<<1], nodes[(node<<1)+1] );
    }

    void update( int node, int left, int right, int index, int value ) {
        if( left == right ) {
            nodes[node] = value;
            return;
        }

        int mid = ( left + right ) >> 1;

        if( index <= mid )
            update( node << 1, left, mid, index, value );
        if( index > mid )
            update( ( node << 1 ) + 1, mid + 1, right, index, value );
        nodes[node] = maximum( nodes[node<<1], nodes[(node<<1)+1] );
    }

    int query( int node, int left, int right, int l, int r ) {
        if( l <= left && r >= right )
            return nodes[node];

        int mid = ( left + right ) / 2;
        int max = -1;
        if( l <= mid )
            max = query( node << 1, left, mid, l, r );
        if( r > mid ) {
            int poss = query( ( node << 1 ) + 1, mid + 1, right, l, r );
            max = maximum( max, poss );
        }
        return max;
    }


};

SegmentTree T;

int main () {
    FILE *f, *g;
    f = fopen( "arbint.in", "r" );
    g = fopen( "arbint.out", "w" );

    int N, M, a, b, op;

    fscanf( f, "%d%d", &N, &M );

    for( int i = 1 ; i <= N ; ++i )
        fscanf( f, "%d", &v[i] );

    T.Build( 1, 1, N ); //construiesc arborele

    for( int i = 0 ; i < M ; ++i ) {
        fscanf( f, "%d%d%d", &op, &a, &b );
        if( op == 0 )
            fprintf( g, "%d\n", T.query( 1, 1, N, a, b ) );
        else
            T.update( 1, 1, N, a, b );
    }

    fclose( f );
    fclose( g );
    return 0;
}