Cod sursa(job #2442780)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 25 iulie 2019 12:21:38
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

const int NMAX = 1e5 + 5;

int N, A[NMAX], M, Type, X, Y;

int V[4 * NMAX];

inline void Update (int Node, int a, int b, int pos, int val)
{
    if(a == b)
    {
        V[Node] = val;

        return;
    }

    int Mid = (a + b) / 2;

    if(pos <= Mid)
        Update(2 * Node, a, Mid, pos, val);

    if(pos > Mid)
        Update(2 * Node + 1, Mid + 1, b, pos, val);

    V[Node] = max(V[2 * Node], V[2 * Node + 1]);

    return;
}

inline int Query (int Node, int a, int b, int qa, int qb)
{
    if(qa <= a && b <= qb)
        return V[Node];

    int Mid = (a + b) / 2;

    int ans1 = -1, ans2 = -1;

    if(qa <= Mid)
        ans1 = Query(2 * Node, a, Mid, qa, qb);

    if(qb > Mid)
        ans2 = Query(2 * Node + 1, Mid + 1, b, qa, qb);

    return max(ans1, ans2);
}

int main()
{
    f.tie(NULL);

    f >> N >> M;

    for(int i = 1; i <= N; ++i)
    {
        f >> A[i];

        Update(1, 1, N, i, A[i]);
    }

    for(int i = 1; i <= M; ++i)
    {
        f >> Type >> X >> Y;

        if(Type == 0)
            g << Query(1, 1, N, X, Y) << '\n';
        else
            Update(1, 1, N, X, Y);
    }

    return 0;
}