Cod sursa(job #947280)

Utilizator BitOneSAlexandru BitOne Data 7 mai 2013 07:39:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdlib>
#include <fstream>

using namespace std;

const int NMAX = (1 << 18) | 1;

int aint[NMAX];


inline int _max(int x, int y) {return x >= y ? x : y;}
inline void Update(int index, int left, int right, const int& pIndex, const int& pValue)
{
    if(left == right)
    {
        aint[index] = pValue;
        return;
    }
    int middle = (left + right) >> 1;

    if(pIndex <= middle) Update(index << 1, left, middle, pIndex, pValue);
    else Update((index << 1 ) | 1, middle + 1, right, pIndex, pValue);

    aint[index] = _max(aint[index << 1], aint[(index << 1) | 1]);
}

inline int Query(int index, int left, int right, const int& start, const int& end)
{
    if(left >= start && right <= end) return aint[index];
    int middle = (left + right) >> 1, m1, m2;

    m1 = m2 = -(1 << 30);
    if(start <= middle) m1 = Query(index << 1, left, middle, start, end);
    if(end > middle) m2 = Query((index << 1) | 1, middle + 1, right, start, end);

    return _max(m1, m2);
}

int main()
{
    int N, M, x, i, start, end, op;
    ifstream in("arbint.in");
    ofstream out("arbint.out");

    in >> N >> M;
    for(i = 1; i <= N; ++i)
    {
        in >> x;
        Update(1, 1, N, i, x);
    }
    for(; M; --M)
    {
        in >> op >> start >> end;
        if(0 == op)
        {
            out << Query(1, 1, N, start, end) << '\n';
        }
        else Update(1, 1, N, start, end);
    }
    return EXIT_SUCCESS;
}