Cod sursa(job #925831)

Utilizator BitOneSAlexandru BitOne Data 24 martie 2013 19:28:15
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int NMAX = 262155;
const int oo   = -(1 << 29);

int v[NMAX];

inline int max(const int& x, const int& y) {return x >= y ? x : y;}
inline void Update(int idx, int left, int right, const int& index, const int& value)
{
    if(left == right)
    {
        v[idx] = value;
        return;
    }
    int middle = (left + right) >> 1;

    if(index <= middle) Update(idx << 1, left, middle, index, value);
    else                Update((idx << 1) | 1, middle + 1, right, index, value);
    v[idx] = max(v[idx << 1], v[(idx << 1) | 1]);
}

inline int Query(int idx, int left, int right, const int& start, const int& end)
{
    if(left >= start && right <= end) return v[idx];

    int m1, m2, middle = (left + right) >> 1;

    m1 = m2 = oo;
    if(start <= middle) m1 = Query(idx << 1, left, middle, start, end);
    if(end > middle)  m2 = Query((idx << 1) | 1, middle + 1, right, start, end);
    return max(m1, m2);
}

int main()
{
    int N, M, i, x, op, a, b;
    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 >> a >> b;
        if(0 == op)
        {
            out << Query(1, 1, N, a, b) << '\n';
        }
        else Update(1, 1, N, a, b);
    }

    return EXIT_SUCCESS;
}