Cod sursa(job #3277188)

Utilizator pkseVlad Bondoc pkse Data 15 februarie 2025 13:25:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <iostream>
using namespace std;

int aint[4 * 100005];

void update(int node, int st, int dr, int pos, int val) {
    if(st == dr) {
        aint[node] = val;
        return;
    }
    int mid = (st + dr) / 2;
    if(pos <= mid) {
        update(node * 2, st, mid, pos, val);
    }
    else {
        update(node * 2 + 1, mid + 1, dr, pos, val);
    }
    aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
    // cout << node << '\n';
}

int query(int node, int st, int dr, int a, int b) {
    if(a <= st && dr <= b) {
        return aint[node];
    }
    int mid = (st + dr) / 2;
    int ml = 0, mr = 0;
    if(a <= mid) {
        ml = query(node * 2, st, mid, a, b);
    }
    if(mid + 1 <= b) {
        mr = query(node * 2 + 1, mid + 1, dr, a, b);
    }
    return max(mr, ml);
}

int main() {
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int q, n; cin >> n >> q;
    for(int i = 1; i <= n; i ++) {
        int x; cin >> x;
        update(1, 1, n, i, x);
        // cout << query(1, 1, n, i, i) << ' ';
    }
    while(q --) {
        int c, a, b; cin >> c >> a >> b;
        if(c == 0) {
            cout << query(1, 1, n, a, b) << '\n';
        } else {
            update(1, 1, n, a, b);
        }
    }
}