Cod sursa(job #2313257)

Utilizator nurof3nCioc Alex-Andrei nurof3n Data 6 ianuarie 2019 15:20:31
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>

using namespace std;

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

const int N_MAX = 100000;

int N, M;
int X, Pos, Maxim, A, B;
int Arb[2 * N_MAX];

void query(int nod, int left, int right) {
    if(nod >= 2 * N)
        return;

    if (A <= left && right <= B) {
        Maxim = max(Maxim, Arb[nod]);
        return;
    }

    int mid = (left + right) / 2;
    if (A <= mid)
        query(2 * nod, left, mid);
    if (mid < B)
        query(2 * nod + 1, mid + 1, right);
}

void update(int nod, int left, int right) {
    if(nod >= 2 * N)
        return;

    if (left == right) {
        Arb[nod] = X;
        return;
    }

    int mid = (left + right) / 2;
    if (Pos <= mid)
        update(2 * nod, left, mid);
    else
        update(2 * nod + 1, mid + 1, right);
    if(nod < N)
        Arb[nod] = max(Arb[2 * nod], Arb[2 * nod + 1]);
}

int main() {
    in >> N >> M;
    for(int i = 0; i < N; ++i) {
        in >> X;
        Pos = i;
        update(1, 0, N - 1);
    }

    bool op;
    for(int i = 0; i < M; ++i) {
        in >> op >> A >> B;
        if(op == 0) {
            --A, --B;
            Maxim = -1;
            query(1, 0, N - 1);
            out << Maxim << '\n';
        }
        if(op == 1) {
            --A;
            X = B, Pos = A;
            update(1, 0, N - 1);
        }
    }
    return 0;
}