Cod sursa(job #3287282)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 17 martie 2025 14:22:57
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include<bits/stdc++.h>
#define int long long

using namespace std;

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

void update(int val, int poz, int arbst, int arbdr, int arbpoz)
{
    if(arbst == arbdr)
    {
        arbint[arbpoz] = val;
        return;
    }
    
    int mij = (arbst + arbdr) / 2;
    if(poz > mij)
        update(val, poz, mij + 1, arbdr, arbpoz * 2 + 1);
    else
        update(val, poz, arbst, mij, arbpoz * 2);
    arbint[arbpoz] = max(arbint[arbpoz * 2], arbint[arbpoz * 2 + 1]);
    
}

int query(int st, int dr, int arbst, int arbdr, int arbpoz)
{
    if(arbst > dr || arbdr < st)
        return 0;
    if(arbst >= st && arbdr <= dr)
    {
        return arbint[arbpoz];
    }
    
    int mij = (arbst + arbdr) / 2;
    return max(query(st, dr, arbst, mij, arbpoz * 2), query(st, dr, mij + 1, arbdr, arbpoz * 2 + 1));
}

int32_t main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    
    cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        cin >> v[i];
        update(v[i], i, 1, n, 1);
    }
    int c, a, b;
    for(int i = 1; i <= m; i++)
    {
        cin >> c >> a >> b;
        if(c == 0)
            cout << query(a, b, 1, n, 1) << "\n";
        else
            update(b, a, 1, n, 1);
    }
}