Cod sursa(job #3165857)

Utilizator Tudor_PascaTudor Pasca Tudor_Pasca Data 7 noiembrie 2023 08:18:33
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>

using namespace std;

const int INF = 1e9;
const int N = 1e5;

int v[4 * N];

int update(int node, int left, int right, int pos, int val) {
    if (left > right)
        return -INF;
    if (left == right) {
        v[node] = val;
        return v[node];
    }
    int mid = (left + right) / 2;
    int leftNode = node * 2, rightNode = node * 2 + 1;
    if (pos <= mid)
        update(leftNode, left, mid, pos, val);
    else
        update(rightNode, mid + 1, right, pos, val);
    v[node] = max(v[leftNode], v[rightNode]);
    return v[node];
}

int query(int node, int left, int right, int lq, int rq) {
    if (right < lq || rq < left)
        return -INF;
    if (lq <= left && right <= rq)
        return v[node];
    int mid = (left + right) / 2;
    int leftNode = node * 2, rightNode = node * 2 + 1;
    int ans = -INF;
    if (lq <= mid)
        ans = max(ans, query(leftNode, left, mid, lq, rq));
    if (mid < rq)
        ans = max(ans, query(rightNode, mid + 1, right, lq, rq));
    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x;
        cin >> x;
        update(1, 1, n, i, x);
    }
    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
            update(1, 1, n, a, b);
    }

    return 0;
}