Pagini recente » Cod sursa (job #2872059) | Cod sursa (job #2595827) | Cod sursa (job #871219) | Cod sursa (job #749109) | Cod sursa (job #1747393)
#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;
}