Cod sursa(job #1046145)

Utilizator mvcl3Marian Iacob mvcl3 Data 2 decembrie 2013 18:21:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <vector>
#include <cmath>

#define in "arbint.in"
#define out "arbint.out"
#define oo 1000000

std :: ifstream f(in);
std :: ofstream g(out);

int N, M;

std :: vector < int > Arb;

inline void Read_Data()
{
    f >> N >> M;

    //Arb.push_back(0);
    for(int x, i = 1; i <= N; ++i)
    {
        f >> x;
        Arb.push_back(x);
    }
}

inline void Build_Tree()
{
    N = (1 << (int(log2(N - 1)) + 1));
    Arb.resize(2 * N, -1);

    for(int i = N; i < 2 * N; ++i)  Arb[i] = Arb[i - N];

    for(int i = N - 1; i > 0; --i)
        Arb[i] = std :: max(Arb[2 * i], Arb[2 * i + 1]);
}

inline int Rmq_Up(int st, int dr)
{
    int ans = -1;
    N = Arb.size() >> 1;

    st += N - 1, dr += N - 1;

    while(st <= dr)
    {
        if(st & 1)         ans = std :: max(ans, Arb[st]);
        if(!(dr & 1))      ans = std :: max(ans, Arb[dr]);

        st = (st + 1) / 2, dr = (dr - 1) / 2;
    }

    return ans;
}

inline void Update(int poz, int elem)
{
    N = Arb.size() / 2;

    poz += N - 1;

    Arb[poz] = elem;

    while(poz >>= 1)
        Arb[poz] = std :: max(Arb[2 * poz], Arb[2 * poz + 1]);
}

int main()
{
    Read_Data();
    Build_Tree();

    for(int tip, x, y, i = 1; i <= M; ++i)
    {
        f >> tip >> x >> y;

        if(!tip)
            g << Rmq_Up(x, y) << '\n';
        else
            Update(x, y);
    }
}