Cod sursa(job #2858142)

Utilizator MR0L3eXMaracine Constantin Razvan MR0L3eX Data 27 februarie 2022 08:48:13
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 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/debug.h"
#endif

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n;
vector<int> v, sgt;

void combine(const int &node) {
    sgt[node] = max(sgt[2 * node + 1], sgt[2 * node + 2]);
}

void bld(int node = 0, int l = 0, int r = n - 1) {
    if (l == r) {
        sgt[node] = v[l];
        return;
    }
    int m = (l + r) / 2;
    bld(2 * node + 1, l, m);
    bld(2 * node + 2, m + 1, r);
    combine(node);
}

int qry(int L, int R, int node = 0, int l = 0, int r = n - 1) {
    if (L <= l && r <= R) {
        return sgt[node];
    }
    int m = (l + r) / 2;
    int mx = -1;
    if (L <= m) {
        mx = max(mx, qry(L, R, 2 * node + 1, l, m));
    }
    if (m < R) {
        mx = max(mx, qry(L, R, 2 * node + 2, m + 1, r));
    }
    return mx;
}

void upd(int p, int x, int node = 0, int l = 0, int r = n - 1) {
    if (l == r) {
        sgt[node] = x;
        return;
    }
    int m = (l + r) / 2;
    if (p <= m) {
        upd(p, x, 2 * node + 1, l, m);
    } else {
        upd(p, x, 2 * node + 2, m + 1, r);
    }
    combine(node);
}

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int Q;
    fin >> n >> Q;
    
    int m = 1;
    while (m < n) m *= 2;
    
    sgt.resize(2 * m);
    v.resize(n);
    
    for (int &x : v) fin >> x;
    
    bld();

    while (Q--) {
        int qt, a, b;
        fin >> qt >> a >> b;
        if (qt == 0) {
            --a, --b;
            fout << qry(a, b) << "\n";
        } else {
            --a;
            upd(a, b);
        }
    }
}