Cod sursa(job #2831354)

Utilizator VladS23Vlad Seba VladS23 Data 11 ianuarie 2022 11:08:15
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>

using namespace std;

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

const int NMAX = 10;

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 N;
int query(int nod, int st, int dr)
{
    int mid;
    mid = (st + dr) / 2;

    if (st > Q_R || dr < Q_L)
        return 0;

    if (Q_L <= st && dr <= Q_R)
        return d[nod];
    return max(query(left(nod), st, mid), query(right(nod), mid + 1, dr));
}

int find_n()
{
    int p = 1;
    while (p <= n)
        p = p * 2;
    return p;
}
int main()
{
    cin >> n >> m;
    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;
            a = N + a - 1;
            while (a >= 1)
            {
                a /= 2;
                d[a] = max(d[left(a)], d[right(a)]);
            }
        }
        else if (t == 0)
        {
            maxi = 0;
            Q_L = a;
            Q_R = b;
            cout << query(1, 1, N) << '\n';
        }
    }
}