Cod sursa(job #3040286)

Utilizator IvanAndreiIvan Andrei IvanAndrei Data 29 martie 2023 17:57:37
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.53 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 v[max_size], aint[max_aint];

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

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

int query (int l, int r, int st, int dr, int nod)
{
    if (st <= l && r <= dr)
    {
        return aint[nod];
    }
    int m = (l + r) / 2, mx1 = 0, mx2 = 0;
    if (st <= m)
    {
        mx1 = query(l, m, st, dr, 2 * nod);
    }
    if (dr > m)
    {
        mx2 = query(m + 1, r, st, dr, 2 * nod + 1);
    }
    return max(mx1, mx2);
}

int main ()
{
    int n, q;
    in >> n >> q;
    for (int i = 1; i <= n; i++)
    {
        in >> v[i];
    }
    init(1, n, 1);
    while (q--)
    {
        int op, x, y;
        in >> op >> x >> y;
        if (op == 0)
        {
            out << query(1, n, x, y, 1) << '\n';
        }
        else
        {
            upd(1, n, x, y, 1);
        }
    }
}