Cod sursa(job #3242159)

Utilizator deerMohanu Dominic deer Data 9 septembrie 2024 16:20:53
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <bits/stdc++.h>

#define int long long
#define fi first
#define se second

#define sz(a) int((a).size())
#define all(a) (a).begin(), (a).end()

#define lsb(x) (x & (-x))
#define vi vector<int>
#define YES { cout << "YES" << endl; return; }
#define NO { cout << "NO" << endl; return; }

using ll = long long;
using pii = std::pair<int, int>;

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
void solve_testcase() {
    int n, q;
    fin >> n >> q;
    vector<int> t(2 * n);
    for (int i = 0; i < n; ++i)
        fin >> t[n + i];

    auto build = [&] {
        for (int i = n - 1; i >= 0; --i)
            t[i] = max(t[i << 1], t[i << 1 | 1]);
    };
    auto update = [&](int p, int val) {
        for (t[p += n] = val; p > 1; p >>= 1)
            t[p >> 1] = max(t[p], t[p ^ 1]);
    };

    auto query = [&](int l, int r) {
        int res = INT_MIN;
        for (l += n, r += n; l < r; l >>= 1, r >>= 1) {
            if (l & 1)
                res = max(res, t[l++]);
            if (r & 1)
                res = max(res, t[--r]);
        }
        return res;
    };

    build();
    for (int i = 0; i < q; ++i) {
        int op, a, b;
        fin >> op >> a >> b;
        if (op == 0)
            fout << query(a - 1, b) << "\n";
        if (op == 1)
            update(a - 1, b);
    }
}
signed main() {
    fin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
    // fin >> t;
    while (t--)
        solve_testcase();
    return 0;
}