Cod sursa(job #1124749)

Utilizator valiro21Valentin Rosca valiro21 Data 26 februarie 2014 13:36:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.67 kb
#include <cstdio>

#define NMax 100001

using namespace std;

long a, b, n, m, v[NMax];
bool bl;

class treeNod {
public:
    treeNod *leftChild, *rightChild;
    long val, ia, ib;

    treeNod ( ) {
        leftChild = rightChild = NULL;
        val = ia = ib = 0;
    }

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

    long createNod ( long v[], long left, long right ) {
        ia = left; ib = right;
        if ( left == right ) {
            val = v[left];
            return v[left];
        }
        else {
            leftChild = new treeNod;
            rightChild = new treeNod;

            long middle = left + ( right - left ) / 2;
            val = max ( leftChild->createNod ( v, left, middle ), rightChild->createNod ( v, middle + 1, right ) );
            return val;
        }
    }

    long maxInter ( long left, long right ) {
        long middle = ia + ( ib - ia ) / 2;
        if ( left == ia && right == ib )
            return val;
        else if ( left <= middle && middle < right) {
            long x1 = leftChild->maxInter ( left, middle );
            long x2 = rightChild->maxInter ( middle + 1, right );
            return max ( x1, x2 );
        }
        else if ( left <= middle && right <= middle )
            return leftChild->maxInter ( left, right );
        else
            return rightChild->maxInter ( left, right );
    }

    long changeVal ( long poz, long value ) {
        if ( ia == ib && ia == poz )
            val = value;
        else {
            long middle = ia + ( ib - ia ) / 2;
            if ( poz <= middle )
                val = max ( leftChild->changeVal ( poz, value ), rightChild->val );
            else
                val = max ( leftChild->val, rightChild->changeVal ( poz, value ) );
        }
        return val;

    }
};

class Tree {
public:
    treeNod *t;
    long maxVal;

    Tree ( ) {
        t = NULL;
        maxVal = 0;
    }

    void createTree ( long v[], long n ) {
        t = new treeNod;
        if ( n > 0 ) maxVal = t->createNod ( v, 1, n );
    }

    void changeVal ( long poz, long value ) {
        maxVal = t->changeVal ( poz, value );
    }

    long maxInter ( long left, long right ) {
        return t->maxInter ( left, right );
    }
} tr;

int main()
{
    freopen ( "arbint.in", "r", stdin );
    freopen ( "arbint.out", "w", stdout );

    scanf ( "%ld %ld", &n, &m );
    for ( long i = 1; i <= n; i++ )
        scanf ( "%ld", &v[i] );

    tr.createTree ( v, n );
    for ( long i = 1; i <= m; i++ ) {
        scanf ( "%ld %ld %ld", &bl, &a, &b );

        if ( bl == 0 )
            printf ( "%ld\n", tr.maxInter ( a, b ) );
        else
            tr.changeVal ( a, b );
    }

    return 0;
}