Cod sursa(job #3367966)

Utilizator TeddyDinutaDinuta Eduard Stefan TeddyDinuta Data 12 octombrie 2026 15:56:26
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <bits/stdc++.h>

using namespace std;

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

int v[100005];
int aint[500005];

void init(int nod, int l, int r) {
    if (l > r)
        return;

    if (l == r) {
        aint[nod] = v[l];
        return;
    }
    
    int m = (l + r) / 2;
    init(2 * nod, l, m);
    init(2 * nod + 1, m + 1, r);

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

void update(int nod, int l, int r, int a, int b) {
    if (l > r)
        return;
    
    if (l == r) {
        v[a] = b;
        aint[nod] = b;
        return;
    }

    int m = (l + r) / 2;
    if (a <= m) {
        update(2 * nod, l, m, a, b);
    } else {
        update(2 * nod + 1, m + 1, r, a, b);
    }

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

int query(int nod, int l, int r, int a, int b) {
    if (r < a || l > b)
        return 0;
    
    if (l >= a && r <= b)
        return aint[nod];
    
    int m = (l + r) / 2;
    return max(query(2 * nod, l, m, a, b), query(2 * nod + 1, m + 1, r, a, b));
}

int main() {
    int n, m;
    in >> n >> m;

    for (int i = 1; i <= n; i++)
        in >> v[i];
    
    init(1, 1, n);
    for (int i = 0; i < m; i++) {
        int op, a, b;
        in >> op >> a >> b;

        if (op == 0) {
            out << query(1, 1, n, a, b) << '\n';
        } else {
            update(1, 1, n, a, b);
        }
    }
}