Cod sursa(job #1328904)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 28 ianuarie 2015 21:06:14
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <fstream>

#define oo (1 << 30)

using namespace std;

class SegmentTree {

    #define root 1
    #define middle ((left + right) >> 1)
    #define leftSon (node << 1)
    #define rightSon ((node << 1) | 1)

    private:
        int size;
        int * tree;

        void update(int node, int left, int right, const int & index, const int & value) {

            if(left == right) {
                tree[node] = value;
                return;
            }

            if(index <= middle)
                update(leftSon, left, middle, index, value);
            else
                update(rightSon, middle + 1, right, index, value);

            tree[node] = max(tree[leftSon], tree[rightSon]);
        }

        int query(int node, int left, int right, const int & a, const int & b) {

            if(a <= left && right <= b)
                return tree[node];

            int e = -oo;
            if(a <= middle)
                e = query(leftSon, left, middle, a, b);
            if(middle < b)
                e = max(e, query(rightSon, middle + 1, right, a, b));

            return e;
        }

    public:
        SegmentTree(int Size) {
            size = Size;
            tree = new int[4*size+1];
        }

        void update(const int & index, const int & value) {
            update(root, 1, size, index, value);
        }

        int query(const int & a, const int & b) {
            return query(root, 1, size, a, b);
        }
};


int main() {

    int i, type, x, y, queries, N;
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in >> N >> queries;
    SegmentTree st(N);
    for(i = 1; i <= N; i++) {
        in >> x;
        st.update(i, x);
    }

    while(queries--) {

        in >> type >> x >> y;

        if(type == 0)
            out << st.query(x, y) << '\n';
        else
            st.update(x, y);

    }

    in.close();
    out.close();

    return 0;
}