Cod sursa(job #2645105)

Utilizator i_0__0_iNaimul i_0__0_i Data 27 august 2020 05:15:01
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.63 kb
#include <bits/stdc++.h>
using namespace std;

#define MAX 100000

int T[MAX*4 + 100];
int l, r;
int pos, val;

int query(int node, int beg, int end) {
    if(beg >= l && end <= r) return T[node];
    if(end < l || beg > r) return INT_MIN;

    int mid = (beg + end) / 2;
    int p = query(2*node, beg, mid);
    int q = query(2*node + 1, mid + 1, end);
    return max(p, q);
}

void update(int node, int beg, int end) {
    if(beg == pos && end == pos) {  // beg == end == pos
        T[node] = val;
        return;
    }
    if(end < pos || beg > pos) return;

    int mid = (beg + end) / 2;
    update(2*node, beg, mid);
    update(2*node + 1, mid+1, end);
    T[node] = max(T[2*node], T[2*node + 1]);
}

int32_t main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr);
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
    int n, m; cin >> n >> m;
    // int start = 1LL << int(ceil(log2(n)));
    int start = 20;
    for (pos = 1; pos <= n; pos++) {
        cin >> val;
        update(1, 1, n);
    }
    // for (int i = 1; i < start + n; i++) cout << "Node: " << i << " " << "val: " << T[i] << '\n';
    // cout << "-----------------------\n";
    while (m--) {
        int x, a, b; cin >> x >> a >> b;
        if (x) {
            pos = a, val = b;
            update(1, 1, n);
        } else {
            l = a, r = b;
            cout << query(1, 1, n) << '\n';
            // for (int i = 1; i < start + n; i++) cout << "Node: " << i << " " << "val: " << T[i] << '\n';
            // cout << "-----------------------\n";            
        }
    }
    return 0;
}