Cod sursa(job #3154267)

Utilizator MerlinTheWizardMelvin Abibula MerlinTheWizard Data 3 octombrie 2023 22:40:22
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<iostream>
#include<stdio.h>

using namespace std;

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

void update(int st, int dr, int idx, int val, int poz)
{
    if(st == dr)
    {
        arb[idx] = val;
        return;
    }
    int mij = (st + dr) / 2;
    if(poz > mij)
        update(mij + 1, dr, (idx * 2) + 1, val, poz);
    else
        update(st, mij, idx * 2, val, poz);
    arb[idx] = max(arb[idx * 2], arb[(idx * 2) + 1]);
}

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

    if(arbst >= st && arbdr <= dr)
        return arb[idx];
    
    int mij = (arbst + arbdr) / 2;
    int valst = query(st, dr, arbst, mij, idx * 2);
    int valdr = query(st, dr, mij + 1, arbdr, (idx * 2) + 1);
    return max(valst, valdr);
}

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(1, n, 1, v[i], i);
    }

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

        if(c == 0)
            cout << query(a, b, 1, n, 1) << "\n";
        else
            update(1, n, 1, b, a);
    }
}