Cod sursa(job #3183492)

Utilizator tamionvTamio Vesa Nakajima tamionv Data 12 decembrie 2023 06:34:15
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
using namespace std;

constexpr int maxn = 1 << 17;

namespace {
template <int niv>
int buf[niv];

template <int niv = maxn>
void build() {
    if constexpr (niv > 1) {
        for (int i = 0; i < niv; i += 2)
            buf<niv / 2>[i / 2] = max(buf<niv>[i], buf<niv>[i + 1]);
        build<niv / 2>();
    }
}

template <int niv>
void rebuild(int i) {
    if constexpr (niv > 1) {
        buf<niv / 2>[i / 2] = max(buf<niv>[i], buf<niv>[i ^ 1]);
        rebuild<niv / 2>(i / 2);
    }
}

void update(int i, int x) {
    buf<maxn>[i] = x;
    rebuild<maxn>(i);
}

template <int niv = maxn>
int query(int st, int dr, int r = 0) {
    if constexpr (niv >= 1) {
        if (st == dr) return r;

        if (st % 2) r = max(r, buf<niv>[st++]);
        if (dr % 2) r = max(r, buf<niv>[--dr]);
        return query<niv / 2>(st / 2, dr / 2, r);
    }
    return 0;
}
};  // namespace

int main() {
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    int n, q;
    f >> n >> q;

    for (int i = 0; i < n; ++i) f >> buf<maxn>[i];

    build();

    for (int t, a, b; q--;) {
        f >> t >> a >> b;
        if (t == 1)
            update(a - 1, b);
        else
            g << query(a - 1, b) << '\n';
    }
}