Cod sursa(job #2966259)

Utilizator Vincent47David Malutan Vincent47 Data 16 ianuarie 2023 22:25:09
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#include <vector>

using namespace std;

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

    const int N = 100001;
    vector<int> arb(N), v(N);

    void build(int nod, int st, int dr)
    {
        if (st == dr)
           arb[nod] = v[st];
        else
        {
            int mid = (st + dr) >> 1;

            build (2 * nod, st, mid);
            build (2 * nod + 1, mid + 1, dr);

            arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
        }
    }

    void update(int nod, int st, int dr, int poz, int val)
    {
        if (st == dr)
            arb[nod] = val;
        else
        {
            int mid = (st + dr) >> 1;

            if (poz <= mid)
                update(2 * nod, st, mid, poz, val);
            else
                update(2 * nod + 1, mid + 1, dr, poz, val);
            arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
        }
    }

    int query(int nod, int st, int dr, int left, int right)
    {
        if (st >= left && dr <= right)
            return arb[nod];

        int mid = (st + dr) >> 1;
        int maxi = 0;

        if (left <= mid)
            maxi = max(maxi, query(2 * nod, st, mid, left, right));
        if (right > mid)
            maxi = max(maxi, query(2 * nod + 1, mid + 1, dr, left, right));
        return maxi;
    }



int main()
{
    int n, m, a, b, op, i;
    cin >> n >> m;

    arb.resize(4 * n);
    v.resize(n);

    for (i = 1; i <= n; ++i)
        cin >> v[i];

    build(1, 1, n);

    for (i = 1; i <= m; ++i) {
        cin >> op >> a >> b;
        if (op == 1)
            update(1, 1, n, a, b);
        else
        cout << query(1, 1, n, a, b) << '\n';
    }

    return 0;
}