Cod sursa(job #1179988)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 29 aprilie 2014 18:42:31
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <cstdio>
#define MAXN 2500001

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

class SegmentTree {
    public:

    int size;
    int nodes[MAXN];

    inline void setSize( int n ) {
        size = n;
    }

    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, X, a, b, op;

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

    T.setSize(N);
    for( int i = 1 ; i <= N ; ++i ) {
        fscanf( f, "%d", &X );
        T.update( 1, 1, N, i, X );
    }

    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;
}