Cod sursa(job #2908792)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 5 iunie 2022 22:08:29
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>

using namespace std;

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

const int max_size = 1e5 + 1, max_aint = 4e5 + 1;

int aint[max_aint], a[max_size], ans;

void init (int nod, int l, int r)
{
    if (l == r)
    {
        aint[nod] = a[l];
        return;
    }
    int m = (l + r) / 2;
    init(2 * nod, l, m);
    init(2 * nod + 1, m + 1, r);
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

void update (int val, int poz, int nod, int l, int r)
{
    if (l == r)
    {
        aint[nod] = val;
        return;
    }
    int m = (l + r) / 2;
    if (poz <= m)
    {
        update(val, poz, 2 * nod, l, m);
    }
    else
    {
        update(val, poz, 2 * nod + 1, m + 1, r);
    }
    aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}

void querry (int nod, int l, int r, int st, int dr)
{
    if (st <= l && r <= dr)
    {
        ans = max(ans, aint[nod]);
        return;
    }
    int m = (l + r) / 2;
    if (st <= m)
    {
        querry(2 * nod, l, m, st, dr);
    }
    if (m < dr)
    {
        querry(2 * nod + 1, m + 1, r, st, dr);
    }
}

int main ()
{
    int n, t;
    in >> n >> t;
    for (int i = 1; i <= n; i++)
    {
        in >> a[i];
    }
    init(1, 1, n);
    while (t--)
    {
        int op, x, y;
        in >> op >> x >> y;
        if (op == 0)
        {
            ans = -1;
            querry(1, 1, n, x, y);
            out << ans << '\n';
        }
        else
        {
            update(y, x, 1, 1, n);
        }
    }
}