Cod sursa(job #2858148)

Utilizator MR0L3eXMaracine Constantin Razvan MR0L3eX Data 27 februarie 2022 09:01:04
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#pragma GCC optimize ("O3")
#pragma GCC target ("sse4")
 
#include "bits/stdc++.h"
 
using namespace std;
 
using ld = long double;
using ll = long long;
using ull = unsigned long long;
 
#if defined(ONPC)
#include "bits/dbg.h"
#endif
 
int n;
vector<int> t;
vector<int> v;
 
void upd(int pos, int val, int node = 0, int l = 0, int r = n - 1) {
    if (l == r) {
        t[node] = val;
        return;
    }
    int m = (l + r) / 2;
    if (pos <= m) {
        upd(pos, val, 2 * node + 1, l, m);
    } else {
        upd(pos, val, 2 * node + 2, m + 1, r);
    }
    t[node] = max(t[2 * node + 1], t[2 * node + 2]);
}
 
int qry(int L, int R, int node = 0, int l = 0, int r = n - 1) {
    if (L <= l && r <= R) {
        return t[node];
    }
    int m = (l + r) / 2;
    return max((L <= m ? qry(L, R, 2 * node + 1, l, m) : -1), (m < R ? qry(L, R, 2 * node + 2, m + 1, r) : -1));
}
 
int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
 
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);
 
    int tt;
    cin >> n >> tt;
    int m = 1;
    while (m * 2 <= n) {
        m *= 2;
    }
    m += m;
    t.resize(2 * m);
    v.resize(n);
    for (int i = 0; i < n; ++i) {
        cin >> v[i];
        upd(i, v[i]);
    }
    while (tt--) {
        int k, a, b;
        cin >> k >> a >> b;
        --a, --b;
        if (k == 1) {
            upd(a, b + 1);
        } else {
            cout << qry(a, b) << "\n";
        }
    }
}