Cod sursa(job #2903921)

Utilizator DariaClemClem Daria DariaClem Data 17 mai 2022 21:28:28
Problema Arbori de intervale Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.17 kb
#include <bits/stdc++.h>

using namespace std;

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

int numere[100000], arbore[500000], nrNumere, nrOperatii;

int mijloc(int stanga, int dreapta) {
    return stanga + (dreapta - stanga) / 2;
}

void construireArbore(int stanga, int dreapta, int index) {
    if (stanga == dreapta)
        arbore[index] = numere[stanga];
    else {
        int mij = mijloc(stanga, dreapta);
        construireArbore(stanga, mij, 2 * index);
        construireArbore(mij + 1, dreapta, 2 * index + 1);
        arbore[index] = max(arbore[index * 2], arbore[index * 2 + 1]);
    }
}

int determinareMaxim(int a, int b, int stanga, int dreapta, int index) {
    if (a <= stanga and dreapta <= b) {
        return arbore[index];
    } else {
        if (a <= dreapta and b >= stanga) {
            int mij = mijloc(stanga, dreapta);
            return max(determinareMaxim(a, b, stanga, mij, 2 * index),
                       determinareMaxim(a, b, mij + 1, dreapta, 2 * index + 1));
        }
    }
    return 0;
}

void afisare();

void actualizare(int stanga, int dreapta, int indexArbore, int indexSchimbat) {
    //if (indexSchimbat >= stanga and indexSchimbat <= dreapta) {
    if (stanga == dreapta) {
        arbore[indexArbore] = numere[indexSchimbat];
    } else {
        int mij = mijloc(stanga, dreapta);
        if (indexSchimbat <= mij)
            actualizare(stanga, mij, indexArbore * 2, indexSchimbat);
        else
            actualizare(mij + 1, dreapta, indexArbore * 2 + 1, indexSchimbat);
        arbore[indexArbore] = max(arbore[indexArbore * 2], arbore[indexArbore * 2 + 1]);
    }
    //}
}


int main() {
    int index, operatie, a, b, stanga = 1, dreapta;
    fin >> nrNumere >> nrOperatii;
    dreapta = nrNumere;
    for (index = 1; index <= nrNumere; index += 1) {
        fin >> numere[index];
    }
    construireArbore(stanga, dreapta, 1);
    for (index = 1; index <= nrOperatii; index += 1) {
        fin >> operatie >> a >> b;
        if (operatie == 0) {
            fout << determinareMaxim(a, b, stanga, dreapta, 1) << "\n";
        } else {
            numere[a] = b;
            actualizare(stanga, dreapta, 1, a);
        }
    }
    return 0;
}