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 | |
| download | cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.tar.gz cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.zip | |
Initial commit
Diffstat (limited to '')
| -rwxr-xr-x | 05_range_queries/a.out | bin | 0 -> 15808 bytes | |||
| -rw-r--r-- | 05_range_queries/dynamic_range_minimum_queries_1649.cpp | 54 | ||||
| -rw-r--r-- | 05_range_queries/dynamic_range_sum_queries_1648.cpp | 50 | ||||
| -rw-r--r-- | 05_range_queries/range_xor_queries_1650.cpp | 20 | ||||
| -rw-r--r-- | 05_range_queries/static_range_minimum_queries_1647.cpp | 47 | ||||
| -rw-r--r-- | 05_range_queries/static_range_sum_queries_1646.cpp | 17 |
6 files changed, 188 insertions, 0 deletions
diff --git a/05_range_queries/a.out b/05_range_queries/a.out new file mode 100755 index 0000000..27b6efc --- /dev/null +++ b/05_range_queries/a.out | |||
| Binary files differ | |||
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 | } | ||
diff --git a/05_range_queries/dynamic_range_sum_queries_1648.cpp b/05_range_queries/dynamic_range_sum_queries_1648.cpp new file mode 100644 index 0000000..ceb6b0c --- /dev/null +++ b/05_range_queries/dynamic_range_sum_queries_1648.cpp | |||
| @@ -0,0 +1,50 @@ | |||
| 1 | #include <algorithm> | ||
| 2 | #include <iostream> | ||
| 3 | #include <vector> | ||
| 4 | |||
| 5 | class SumFenwickTree { | ||
| 6 | public: | ||
| 7 | SumFenwickTree(int n) : a(n+1) {} | ||
| 8 | long long sum(int l, int r) const { return psum(r) - psum(l-1); } | ||
| 9 | void update(int k, long long u) { add(k, u - sum(k, k));} | ||
| 10 | |||
| 11 | private: | ||
| 12 | std::vector<long long> a; | ||
| 13 | |||
| 14 | static int lsb(int i) { return i & -i; } | ||
| 15 | |||
| 16 | long long psum(int i) const { | ||
| 17 | long long s = 0; | ||
| 18 | while (i > 0) { | ||
| 19 | s += a[i]; | ||
| 20 | i -= lsb(i); | ||
| 21 | } | ||
| 22 | return s; | ||
| 23 | } | ||
| 24 | |||
| 25 | void add(int k, long long d) { | ||
| 26 | while (k < (int)a.size()) { | ||
| 27 | a[k] += d; | ||
| 28 | k += lsb(k); | ||
| 29 | } | ||
| 30 | } | ||
| 31 | }; | ||
| 32 | |||
| 33 | int main() { | ||
| 34 | size_t n, q; | ||
| 35 | std::cin >> n >> q; | ||
| 36 | SumFenwickTree t(n); | ||
| 37 | for (size_t i = 0; i < n; i++) { | ||
| 38 | long long x; | ||
| 39 | std::cin >> x; | ||
| 40 | t.update(i+1, x); | ||
| 41 | } | ||
| 42 | for (size_t i = 0; i < q; i++) { | ||
| 43 | long long x, k, u; | ||
| 44 | std::cin >> x >> k >> u; | ||
| 45 | if (x == 1) | ||
| 46 | t.update(k, u); | ||
| 47 | else | ||
| 48 | std::cout << t.sum(k, u) << "\n"; | ||
| 49 | } | ||
| 50 | } | ||
diff --git a/05_range_queries/range_xor_queries_1650.cpp b/05_range_queries/range_xor_queries_1650.cpp new file mode 100644 index 0000000..e6a4500 --- /dev/null +++ b/05_range_queries/range_xor_queries_1650.cpp | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | #include <algorithm> | ||
| 2 | #include <iostream> | ||
| 3 | #include <vector> | ||
| 4 | |||
| 5 | int main() { | ||
| 6 | size_t n, q; | ||
| 7 | std::cin >> n >> q; | ||
| 8 | std::vector<int> p(n); | ||
| 9 | for (size_t i = 0; i < n; i++) | ||
| 10 | std::cin >> p[i]; | ||
| 11 | for (size_t i = 1; i < n; i++) | ||
| 12 | p[i] ^= p[i-1]; | ||
| 13 | for (size_t i = 0; i < q; i++) { | ||
| 14 | int x, k, s; | ||
| 15 | std::cin >> x >> k; | ||
| 16 | s = p[k-1]; | ||
| 17 | if (x > 1) s ^= p[x-2]; | ||
| 18 | std::cout << s << "\n"; | ||
| 19 | } | ||
| 20 | } | ||
diff --git a/05_range_queries/static_range_minimum_queries_1647.cpp b/05_range_queries/static_range_minimum_queries_1647.cpp new file mode 100644 index 0000000..ef11438 --- /dev/null +++ b/05_range_queries/static_range_minimum_queries_1647.cpp | |||
| @@ -0,0 +1,47 @@ | |||
| 1 | #include <iostream> | ||
| 2 | #include <limits> | ||
| 3 | #include <vector> | ||
| 4 | |||
| 5 | int minrange(std::vector<int>& a, int x, int y, int i, int p, int l, int r) { | ||
| 6 | if (x == l && y == r) | ||
| 7 | return a[2*p-2-i]; | ||
| 8 | |||
| 9 | if (x >= y) | ||
| 10 | return std::numeric_limits<int>::max(); | ||
| 11 | |||
| 12 | int lr = (l+r)/2; | ||
| 13 | return std::min( | ||
| 14 | minrange(a, std::max(x, l), std::min(y, lr), 2*i+2, p, l, lr), | ||
| 15 | minrange(a, std::max(x, lr), std::min(y, r), 2*i+1, p, lr, r) | ||
| 16 | ); | ||
| 17 | } | ||
| 18 | |||
| 19 | void compute_mins(std::vector<int>& a, int j, int n) { | ||
| 20 | for (int i = 0; i < n; i += 2) | ||
| 21 | a[j+n+i/2] = std::min(a[j+i], a[j+i+1]); | ||
| 22 | } | ||
| 23 | |||
| 24 | int main() { | ||
| 25 | int n, q, x, y, p; | ||
| 26 | std::cin >> n >> q; | ||
| 27 | |||
| 28 | // For simplicity, extend n to a power of 2 | ||
| 29 | for (p = 1; p < n; p <<= 1) ; | ||
| 30 | |||
| 31 | std::vector<int> a(2*p-1, 0); | ||
| 32 | for (int i = 0; i < n; i++) | ||
| 33 | std::cin >> a[i]; | ||
| 34 | |||
| 35 | // a[p], a[p+1] ... a[p+p/2-1] are min of pairs | ||
| 36 | // a[p+p/2], a[p+p/2+1], ... a[p+p/2+p/4] are min of quads | ||
| 37 | // etc... | ||
| 38 | for (int i = 1, j = 0; i < p; i <<= 1) { | ||
| 39 | compute_mins(a, j, p/i); | ||
| 40 | j += p/i; | ||
| 41 | } | ||
| 42 | |||
| 43 | for (int i = 0; i < q; i++) { | ||
| 44 | std::cin >> x >> y; | ||
| 45 | std::cout << minrange(a, x-1, y, 0, p, 0, p) << "\n"; | ||
| 46 | } | ||
| 47 | } | ||
diff --git a/05_range_queries/static_range_sum_queries_1646.cpp b/05_range_queries/static_range_sum_queries_1646.cpp new file mode 100644 index 0000000..7de69a2 --- /dev/null +++ b/05_range_queries/static_range_sum_queries_1646.cpp | |||
| @@ -0,0 +1,17 @@ | |||
| 1 | #include <iostream> | ||
| 2 | #include <vector> | ||
| 3 | |||
| 4 | int main() { | ||
| 5 | int n, q, x, y; | ||
| 6 | std::cin >> n >> q; | ||
| 7 | std::vector<long long> a(n+1, 0); | ||
| 8 | for (int i = 1; i <= n; i++) { | ||
| 9 | std::cin >> a[i]; | ||
| 10 | a[i] += a[i-1]; | ||
| 11 | } | ||
| 12 | |||
| 13 | for (int i = 0; i < q; i++) { | ||
| 14 | std::cin >> x >> y; | ||
| 15 | std::cout << a[y]-a[x-1] << "\n"; | ||
| 16 | } | ||
| 17 | } | ||
