aboutsummaryrefslogtreecommitdiff
path: root/05_range_queries
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
downloadcses-96254947699986c59f0dc63d69fd4b76bd3ed43e.tar.gz
cses-96254947699986c59f0dc63d69fd4b76bd3ed43e.zip
Initial commit
Diffstat (limited to '05_range_queries')
-rwxr-xr-x05_range_queries/a.outbin0 -> 15808 bytes
-rw-r--r--05_range_queries/dynamic_range_minimum_queries_1649.cpp54
-rw-r--r--05_range_queries/dynamic_range_sum_queries_1648.cpp50
-rw-r--r--05_range_queries/range_xor_queries_1650.cpp20
-rw-r--r--05_range_queries/static_range_minimum_queries_1647.cpp47
-rw-r--r--05_range_queries/static_range_sum_queries_1646.cpp17
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
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}
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
5class SumFenwickTree {
6public:
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
11private:
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
33int 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
5int 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
5int 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
19void 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
24int 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
4int 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}

Generated with cgit - Back to sebastiano.tronto.net