Cod sursa(job #2756052)

Utilizator JackstilAdascalitei Alexandru Jackstil Data 29 mai 2021 12:12:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <algorithm>
#include <fstream>
#define mid (st+dr)/2

using namespace std;

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

int n, m, q, a, b, arbore[100000001], x, start, fin, poz, maxim, val;

void actualizare(int nod, int st, int dr) {
     if (st == dr) {
        arbore[nod] = val;
        return;
     }

     if (poz <= mid)
        actualizare(2 * nod, st, mid);
     else
        actualizare(2 * nod + 1, mid + 1, dr);

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

void interogare(int nod, int st, int dr) {
    if (start <= st && dr <= fin) {
        if (maxim < arbore[nod])
            maxim = arbore[nod];
        return;
    }

    if (start <= mid)
        interogare(2 * nod, st, mid);
    if (mid < fin)
        interogare(2 * nod + 1, mid + 1, dr);
}

int main() {
    in >> n >> m;
    for (int i = 1; i <= n; ++i) {
        in >> x;

        poz = i, val = x;
        actualizare(1, 1, n);
    }

    while (m--) {
        in >> q >> a >> b;

        if (q == 0) {
            maxim = -1;
            start = a, fin = b;
            interogare(1, 1, n);

            out << maxim << '\n';
        } else {
            poz = a, val = b;
            actualizare(1, 1, n);
        }

    }
    return 0;
}