Cod sursa(job #3132423)

Utilizator omaclearuMacelaru Octavian Andrei omaclearu Data 22 mai 2023 19:10:52
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.42 kb
#include <iostream>
#include <fstream>
#include <vector>

class ArboreSegment {
private:
    std::vector<int> arbore;
    int dimensiune;

    int getMaxim(int a, int b) {
        return std::max(a, b);
    }

    void actualizare(int nod, int stanga, int dreapta, int index, int valoare) {
        if (stanga == dreapta) {
            arbore[nod] = valoare;
        } else {
            int mijloc = (stanga + dreapta) / 2;
            if (index <= mijloc) {
                actualizare(2 * nod, stanga, mijloc, index, valoare);
            } else {
                actualizare(2 * nod + 1, mijloc + 1, dreapta, index, valoare);
            }
            arbore[nod] = getMaxim(arbore[2 * nod], arbore[2 * nod + 1]);
        }
    }

    int interogare(int nod, int stanga, int dreapta, int stanga_cautare, int dreapta_cautare) {
        if (stanga_cautare <= stanga && dreapta <= dreapta_cautare) {
            return arbore[nod];
        } else if (dreapta < stanga_cautare || stanga > dreapta_cautare) {
            return 0;
        } else {
            int mijloc = (stanga + dreapta) / 2;
            int rezultat_stanga = interogare(2 * nod, stanga, mijloc, stanga_cautare, dreapta_cautare);
            int rezultat_dreapta = interogare(2 * nod + 1, mijloc + 1, dreapta, stanga_cautare, dreapta_cautare);
            return getMaxim(rezultat_stanga, rezultat_dreapta);
        }
    }

public:
    ArboreSegment(int n) {
        dimensiune = n;
        arbore.resize(4 * dimensiune);
    }

    void actualizare(int index, int valoare) {
        actualizare(1, 1, dimensiune, index, valoare);
    }

    int interogare(int stanga, int dreapta) {
        return interogare(1, 1, dimensiune, stanga, dreapta);
    }
};

class Meniu {
    int n, m, x, t, p, q;
    ArboreSegment *arboreSegment;
public:
    void run() {
        std::ifstream fin("arbint.in");
        std::ofstream fout("arbint.out");

        fin >> n >> m;
        arboreSegment = new ArboreSegment(n);

        for (int i = 1; i <= n; i++) {
            fin >> x;
            arboreSegment->actualizare(i, x);
        }

        for (int i = 1; i <= m; i++) {
            fin >> t >> p >> q;
            if (t) {
                arboreSegment->actualizare(p, q);
            } else {
                fout << arboreSegment->interogare(p, q) << '\n';
            }
        }
    }

    ~Meniu() {
        delete arboreSegment;
    };
};

int main() {
    Meniu meniu;
    meniu.run();
    return 0;
}