Cod sursa(job #1747393)

Utilizator preda.andreiPreda Andrei preda.andrei Data 24 august 2016 20:55:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.07 kb
#include <iostream>
#include <fstream>

using namespace std;

struct Nod
{
    int stanga, dreapta;
    Nod *fiuStanga, *fiuDreapta;
    int maxim;
};

int aflaMaximInterval(Nod *nod, int st, int dr);
void schimbaValoarea(Nod *nod, int poz, int valNou);
Nod* construiesteArbore(int st, int dr);

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

    int n, m;
    fin >> n >> m;

    Nod *radacina = construiesteArbore(1, n);

    for (int i = 1; i <= n; ++i) {
        int x;
        fin >> x;
        schimbaValoarea(radacina, i, x);
    }

    while (m--) {
        int r, x, y;
        fin >> r >> x >> y;
        if (r == 1) {
            schimbaValoarea(radacina, x, y);
        }
        else {
            fout << aflaMaximInterval(radacina, x, y) << "\n";
        }
    }

    return 0;
}

int aflaMaximInterval(Nod *nod, int st, int dr)
{
    int maxim = 0;

    if (st <= nod->stanga && nod->dreapta <= dr) {
        maxim = nod->maxim;
    }
    else {
        int mij = nod->stanga + (nod->dreapta - nod->stanga) / 2;
        if (st <= mij) {
            maxim = aflaMaximInterval(nod->fiuStanga, st, dr);
        }
        if (dr > mij) {
            maxim = max(maxim, aflaMaximInterval(nod->fiuDreapta, st, dr));
        }
    }

    return maxim;
}

void schimbaValoarea(Nod *nod, int poz, int valNou)
{
    if (nod->stanga == poz && nod->dreapta == poz) {
        nod->maxim = valNou;
        return;
    }

    int mij = nod->stanga + (nod->dreapta - nod->stanga) / 2;
    if (poz <= mij) {
        schimbaValoarea(nod->fiuStanga, poz, valNou);
    }
    else {
        schimbaValoarea(nod->fiuDreapta, poz, valNou);
    }

    nod->maxim = max(nod->fiuStanga->maxim, nod->fiuDreapta->maxim);
}

Nod* construiesteArbore(int st, int dr)
{
    Nod *nou = new Nod{st, dr, NULL, NULL, 0};
    if (st != dr) {
        int mij = st + (dr - st) / 2;
        nou->fiuStanga = construiesteArbore(st, mij);
        nou->fiuDreapta = construiesteArbore(mij + 1, dr);
    }

    return nou;
}