Cod sursa(job #2825363)

Utilizator VladS23Vlad Seba VladS23 Data 4 ianuarie 2022 16:56:22
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <fstream>

using namespace std;

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

const int NMAX = 1e5;

int n, m;
int Q_L, Q_R;
int d[2 * NMAX + 5];

int left(int x) { return 2 * x; }
int right(int x) { return 2 * x + 1; }
int dad(int x) { return x / 2; }

int maxi = 0;
int query(int nod, int st, int dr)
{
    int mid = (st + dr) / 2;

    if (mid < Q_L)
    {
        query(right(nod), mid, dr);
    }
    else if (mid > Q_R)
    {
        query(left(nod), st, mid);
    }
    else
    {
        if (st >= Q_L && dr <= Q_R)
        {
            maxi = max(maxi, d[nod]);
        }
        if (st < Q_L)
            query(left(nod), st, mid);
        if (dr > Q_R)
            query(right(nod), mid, dr);
    }
    return maxi;
}

int find_n()
{
    int p = 1;
    while (p <= n)
        p = p * 2;
    return p;
}
int main()
{
    cin >> n >> m;
    int N = find_n();
    for (int i = 1; i <= n; i++)
        cin >> d[N + i - 1];
    for (int i = N - 1; i >= 1; i--)
        d[i] = max(d[left(i)], d[right(i)]);

    for (int i = 1; i <= m; i++)
    {
        int t, a, b;
        cin >> t >> a >> b;

        if (t == 1)
        {
            d[n + a - 1] = b;
            while (a >= 1)
            {
                a /= 2;
                d[a] = max(left(a), right(a));
            }
        }
        else if (t == 0)
        {
            Q_L = a;
            Q_R = b;
            cout << query(1, 1, N) << '\n';
        }
    }
}