Cod sursa(job #2904329)

Utilizator Valentin06Maftei Valentin Valentin06 Data 17 mai 2022 23:15:39
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

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

int nrElemente, nrOperatii, arbore[1000001], element, a, b, maxim, operatie;

void update(int nod, int stanga, int dreapta, int valoare, int pozitie) {
    if (stanga == dreapta) {
        arbore[nod] = valoare;
        return;
    }
    if (pozitie <= (stanga + dreapta) / 2)
        update(nod * 2, stanga, (stanga + dreapta) / 2, valoare, pozitie);
    else
        update(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, valoare, pozitie);
    arbore[nod] = max(arbore[nod * 2], arbore[nod * 2 + 1]);
}

void maximarb(int nod, int stanga, int dreapta, int inceput, int final) {
    if (inceput <= stanga && dreapta <= final) {
        maxim = max(maxim, arbore[nod]);
        return;
    }
        if (inceput <= (stanga + dreapta) / 2)
            maximarb(nod * 2, stanga, (stanga + dreapta) / 2, inceput, final);
        if ((stanga + dreapta) / 2 < final)
            maximarb(nod * 2 + 1, (stanga + dreapta) / 2 + 1, dreapta, inceput, final);
}

int main() {
    in >> nrElemente >> nrOperatii;
    for (int i = 1; i <= nrElemente; i++) {
        in >> element;
        update(1, 1, nrElemente, element, i);
    }
    for (int i = 1; i <= nrOperatii; i++) {
        in >> operatie >> a >> b;
        if (operatie == 0) {
            maxim = -1;
            maximarb(1, 1, nrElemente, a, b);
            out << maxim << '\n';
        } else if (operatie == 1) {
            update(1, 1, nrElemente, b, a);
        }
    }
    return 0;
}