Cod sursa(job #3031777)

Utilizator SSKMFSS KMF SSKMF Data 20 martie 2023 19:35:36
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.19 kb
#include <fstream>
#include <vector>
using namespace std;

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

vector <int> Arbore , sir;

void Creare_Arbore (int nod , int stanga , int dreapta)
{
    if (stanga == dreapta)
        Arbore[nod] = sir[stanga];
    else
    {
        int mijloc = (stanga + dreapta) / 2;

        Creare_Arbore(2 * nod , stanga , mijloc);
        Creare_Arbore(2 * nod + 1 , mijloc + 1 , dreapta);

        Arbore[nod] = max(Arbore[2 * nod] , Arbore[2 * nod + 1]);
    }
}

int Maxim (int nod , int stanga , int dreapta , int interval_stanga , int interval_dreapta)
{
    if (interval_stanga <= stanga && dreapta <= interval_dreapta)
        return Arbore[nod];
    
    int mijloc = (stanga + dreapta) / 2 , maxim_1 = -2e9 , maxim_2 = -2e9;

    if (interval_stanga <= mijloc)
        maxim_1 = Maxim(2 * nod , stanga , mijloc , interval_stanga , interval_dreapta);

    if (interval_dreapta > mijloc)
        maxim_2 = Maxim(2 * nod + 1 , mijloc + 1 , dreapta , interval_stanga , interval_dreapta);

    return max(maxim_1 , maxim_2);
}

void Inlocuire (int nod , int stanga , int dreapta , int pozitie , int valoare)
{
    if (stanga == dreapta)
        Arbore[nod] = valoare;
    else
    {
        int mijloc = (stanga + dreapta) / 2;

        if (pozitie <= mijloc)
            Inlocuire(2 * nod , stanga , mijloc , pozitie , valoare);
        else
            Inlocuire(2 * nod + 1 , mijloc + 1 , dreapta , pozitie , valoare);

        Arbore[nod] = max(Arbore[2 * nod] , Arbore[2 * nod + 1]);
    }
}

int main ()
{
    int lungime , operatii;
    cin >> lungime >> operatii;

    sir.resize(lungime + 1) , Arbore.resize(4 * lungime + 1);
    for (int indice = 1 ; indice <= lungime ; indice++)
        cin >> sir[indice];

    Creare_Arbore(1 , 1 , lungime);

    int tip , stanga , dreapta;
    for (int indice = 1 ; indice <= operatii ; indice++)
    {
        cin >> tip >> stanga >> dreapta;

        if (!tip)
            cout << Maxim(1 , 1 , lungime , stanga , dreapta) << '\n';
        else
            Inlocuire(1 , 1 , lungime , stanga , dreapta);
    }

    cout.close(); cin.close();
    return 0;
}