aboutsummaryrefslogtreecommitdiff
path: root/05_range_queries/dynamic_range_minimum_queries_1649.cpp
diff options
context:
space:
mode:
authorSebastiano Tronto <sebastiano@tronto.net>2026-07-06 19:08:08 +0200
committerSebastiano Tronto <sebastiano@tronto.net>2026-07-06 19:08:08 +0200
commit96254947699986c59f0dc63d69fd4b76bd3ed43e (patch)
tree6c4dca945d7f7427c48be234d827fe4d33be02c5 /05_range_queries/dynamic_range_minimum_queries_1649.cpp
downloadcses-96254947699986c59f0dc63d69fd4b76bd3ed43e.tar.gz
cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.zip
Initial commit
Diffstat (limited to '05_range_queries/dynamic_range_minimum_queries_1649.cpp')
-rw-r--r--05_range_queries/dynamic_range_minimum_queries_1649.cpp54
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
5constexpr size_t inf = 1999999999;
6
7class SegmentTree {
8public:
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
19private:
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
37int 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}

Generated with cgit - Back to sebastiano.tronto.net