Cod sursa(job #2082003)

Utilizator andreiomd1Onut Andrei andreiomd1 Data 5 decembrie 2017 16:31:23
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 100000;

int arbore[4 * NMAX + 1];

void actualizeaza(int pozitie, int valoare, int nod, int a, int b) {
    if (a == b) {
        arbore[nod] = valoare;
        return;
    }

    int m = (a + b) / 2;
    if (pozitie <= m)
        actualizeaza(pozitie, valoare, 2 * nod, a, m);
    else
        actualizeaza(pozitie, valoare, 2 * nod + 1, m + 1, b);

    arbore[nod] = max(arbore[2 * nod], arbore[2 * nod + 1]);
}

int afla(int l, int r, int nod, int a, int b) {
    if (l <= a && b <= r) return arbore[nod];

    int m = (a + b) / 2;
    int rez1 = -1;
    int rez2 = -1;
    if (l <= m) rez1 = afla(l, r, 2 * nod, a, m);
    if (r > m) rez2 = afla(l, r, 2 * nod + 1, m + 1, b);

    return max(rez1, rez2);
}

int main() {
    int n, m, op, a, b;
    f >> n >> m;

    for (int i = 1; i <= n; i++) {
        f >> a;
        actualizeaza(i, a, 1, 1, n);
    }

    for (int i = 1; i <= m; i++) {
        f >> op >> a >> b;
        if (op == 1)
            actualizeaza(a, b, 1, 1, n);
        else
            g << afla(a, b, 1, 1, n) << '\n';
    }

    return 0;
}