diff options
| author | Sebastiano Tronto <sebastiano@tronto.net> | 2026-07-06 19:08:08 +0200 |
|---|---|---|
| committer | Sebastiano Tronto <sebastiano@tronto.net> | 2026-07-06 19:08:08 +0200 |
| commit | 96254947699986c59f0dc63d69fd4b76bd3ed43e (patch) | |
| tree | 6c4dca945d7f7427c48be234d827fe4d33be02c5 /05_range_queries/dynamic_range_minimum_queries_1649.cpp | |
| download | cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.tar.gz cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.zip | |
Initial commit
Diffstat (limited to '')
| -rw-r--r-- | 05_range_queries/dynamic_range_minimum_queries_1649.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/05_range_queries/dynamic_range_minimum_queries_1649.cpp b/05_range_queries/dynamic_range_minimum_queries_1649.cpp new file mode 100644 index 0000000..c4d9b34 --- /dev/null +++ b/05_range_queries/dynamic_range_minimum_queries_1649.cpp | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | #include <algorithm> | ||
| 2 | #include <iostream> | ||
| 3 | #include <vector> | ||
| 4 | |||
| 5 | constexpr size_t inf = 1999999999; | ||
| 6 | |||
| 7 | class SegmentTree { | ||
| 8 | public: | ||
| 9 | SegmentTree(size_t n) : m{pow2ceil(n)}, v(2*m, inf) {} | ||
| 10 | |||
| 11 | void update(size_t i, size_t x) { | ||
| 12 | v[m+i-1] = x; | ||
| 13 | for (size_t p = (m+i-1)/2; p > 0; p /= 2) | ||
| 14 | v[p] = std::min(v[2*p], v[2*p+1]); | ||
| 15 | } | ||
| 16 | |||
| 17 | size_t min(size_t a, size_t b) { return q(a-1, b, 1, 0, m); } | ||
| 18 | |||
| 19 | private: | ||
| 20 | size_t m; | ||
| 21 | std::vector<size_t> v; | ||
| 22 | static constexpr size_t pow2ceil(size_t x) { | ||
| 23 | size_t c; | ||
| 24 | for (c = 1; c < x; c *= 2) ; | ||
| 25 | return c; | ||
| 26 | } | ||
| 27 | |||
| 28 | size_t q(size_t a, size_t b, size_t i, size_t l, size_t r) { | ||
| 29 | if (a == l && b == r) return v[i]; | ||
| 30 | size_t p{(l+r)/2}, s{inf}; | ||
| 31 | if (a < p) s = std::min(s, q(a, std::min(b, p), 2*i, l, p)); | ||
| 32 | if (b > p) s = std::min(s, q(std::max(a, p), b, 2*i+1, p, r)); | ||
| 33 | return s; | ||
| 34 | } | ||
| 35 | }; | ||
| 36 | |||
| 37 | int main() { | ||
| 38 | size_t n, q; | ||
| 39 | std::cin >> n >> q; | ||
| 40 | SegmentTree t(n); | ||
| 41 | for (size_t i = 0; i < n; i++) { | ||
| 42 | size_t x; | ||
| 43 | std::cin >> x; | ||
| 44 | t.update(i+1, x); | ||
| 45 | } | ||
| 46 | for (size_t i = 0; i < q; i++) { | ||
| 47 | int u, a, b; | ||
| 48 | std::cin >> u >> a >> b; | ||
| 49 | if (u == 1) | ||
| 50 | t.update(a, b); | ||
| 51 | else | ||
| 52 | std::cout << t.min(a, b) << "\n"; | ||
| 53 | } | ||
| 54 | } | ||
