Cod sursa(job #3310428)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 13 septembrie 2025 19:58:51
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.24 kb
#include<bits/stdc++.h>

using namespace std;

const int NMAX = 1e5 + 5;
int n, m, v[NMAX], arbint[4 * NMAX];

void update(int pos, int val, int arbst, int arbdr, int idx)
{
    if(arbst == arbdr)
    {
        arbint[idx] = val;
        return;
    }

    int mij = (arbst + arbdr) / 2;
    if(pos > mij)
        update(pos, val, mij + 1, arbdr, idx * 2 + 1);
    else
        update(pos, val, arbst, mij, idx * 2);

    arbint[idx] = max(arbint[idx * 2], arbint[idx * 2 + 1]);
}

int query(int arbst, int arbdr, int st, int dr, int idx)
{
    if(arbst > dr || arbdr < st)
        return 0;

    if(arbst >= st && arbdr <= dr)
        return arbint[idx];

    int mij = (arbst + arbdr) / 2;
    return max(query(arbst, mij, st, dr, idx * 2), query(mij + 1, arbdr, st, dr, idx * 2 + 1));
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> v[i];
        update(i, v[i], 1, n, 1);
    }

    int c, a, b;
    for(int i = 1; i <= m; i++)
    {
        cin >> c >> a >> b;
        if(c == 1)
        {
            update(a, b, 1, n, 1);
            v[a] = b;
        }
        else
        {
            cout << query(1, n, a, b, 1) << "\n";
        }
    }
}