Cod sursa(job #2921518)

Utilizator tzancauraganuTzanca Uraganu tzancauraganu Data 31 august 2022 14:53:10
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#include <vector>
#include <cassert>

using namespace std;

void update(int n, int l, int r, int p, int val, vector<int>& V) {
    if (l >= r) {
        assert(l == r && l == p);
        V[n] = val;
        return;
    }

    int m = (l + r) / 2;
    if (p <= m)
        update(2 * n, l, m, p, val, V);
    else
        update(2 * n + 1, m + 1, r, p, val, V);
    
    V[n] = max(V[2 * n], V[2 * n + 1]);
}

int getMax(int n, int l, int r, int a, int b, vector<int> & V) {
    assert(l <= r);
    if (a <= l && r <= b) {
        return V[n];
    }
    int m = (l + r) / 2;
    int val = 0;
    if (a <= m)
        val = getMax(2 * n, l, m, a, b, V);
    if (b >= m + 1)
        val = max(val, getMax(2 * n + 1, m + 1, r, a, b, V));
    
    return val;
}

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

    int N, M;
    f >> N >> M;

    vector<int> V(4 * N + 10);

    for (int i = 1; i <= N; i++) {
        int x;
        f >> x;
        update(1, 1, N, i, x, V);
    }

    for (int i = 0; i < M; i++) {
        int op, a, b;
        f >> op >> a >> b;
        if (op == 1)
            update(1, 1, N, a, b, V);
        else
            g << getMax(1, 1, N, a, b, V) << '\n';
    }

    f.close();
    g.close();
    return 0;
}