Cod sursa(job #3037707)

Utilizator bibiancapitu2004Pitu Bianca bibiancapitu2004 Data 26 martie 2023 11:28:02
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
using namespace std;

const int MAX_N = 100005;

int v[MAX_N];
int aint[4 * MAX_N];

void build(int node, int left, int right) {
    if (left == right) {
        aint[node] = v[left];
        return;
    }
    int middle = (left + right) / 2;
    build(2 * node, left, middle);
    build(2 * node + 1, middle + 1, right);
    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

void update(int node, int left, int right, int pos, int val) {
    if (left == right) {
        aint[node] = val;
        return;
    }
    int middle = (left + right) / 2;
    if (pos <= middle)
        update(2 * node, left, middle, pos, val);
    else
        update(2 * node + 1, middle + 1, right, pos, val);
    aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}

int query(int node, int left, int right, int qLeft, int qRight) {
    if (qLeft <= left && right <= qRight) {
        return aint[node];
    }
    int middle = (left + right) / 2;
    int res = -1;
    if (qLeft <= middle)
        res = max(res, query(2 * node, left, middle, qLeft, qRight));
    if (middle + 1 <= qRight)
        res = max(res, query(2 * node + 1, middle + 1, right, qLeft, qRight));
    return res;
}

int main() {
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");

    int N, M;
    cin >> N >> M;
    for (int i = 1; i <= N; ++i)
        cin >> v[i];

    build(1, 1, N);
    for (int i = 1; i <= M; ++i) {
        int op, a, b;
        cin >> op >> a >> b;
        if (op == 0) {
            cout << query(1, 1, N, a, b) << '\n';
        } else {
            v[a] = b;
            update(1, 1, N, a, b);
        }
    }

    return 0;
}