summaryrefslogtreecommitdiff
path: root/datastructures/test/lazyPropagation.cpp
diff options
context:
space:
mode:
authorGloria Mundi <gloria@gloria-mundi.eu>2024-05-01 21:25:26 +0200
committerGloria Mundi <gloria@gloria-mundi.eu>2024-05-01 21:25:26 +0200
commite0beaa56b648367bc52dc8c7d44162ac1c8b45fe (patch)
tree8320be6afe8953e1cf4cc98b00ba87e1ba66e58a /datastructures/test/lazyPropagation.cpp
parent5e012c297016f928260b9a4cb00b24de2d415df9 (diff)
slightly simplify lazy propagation and add tests
Diffstat (limited to 'datastructures/test/lazyPropagation.cpp')
-rw-r--r--datastructures/test/lazyPropagation.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/datastructures/test/lazyPropagation.cpp b/datastructures/test/lazyPropagation.cpp
new file mode 100644
index 0000000..df97b14
--- /dev/null
+++ b/datastructures/test/lazyPropagation.cpp
@@ -0,0 +1,102 @@
+#include "lazyPropagation.tmp.cpp"
+
+void test(int n) {
+#ifndef SEGTREE_INIT_DEFAULT
+ vector<ll> a(n);
+ for (ll &x: a) x = util::randint();
+ SegTree seg(a);
+#else
+ ll init = util::randint();
+# ifdef SEGTREE_FIRST_NEG
+ init = abs(init);
+# endif
+ vector<ll> a(n, init);
+ SegTree seg(n, init);
+#endif
+ for (int i = 0; i < 5*n; i++) {
+ {
+ int l = util::randint(n+1);
+ int r = util::randint(n+1);
+ if (l > r) swap(l, r);
+ ll v = util::randint();
+#ifndef SEGTREE_FIRST_NEG
+# ifndef SEGTREE_MAX
+ if (v == 0) v = 1;
+# endif
+#endif
+ for (int j = l; j < r; j++) {
+#ifndef SEGTREE_MAX
+ a[j] = v;
+#else
+ a[j] += v;
+#endif
+ }
+ seg.update(l, r, v);
+ }
+ {
+ int l = util::randint(n+1);
+ int r = util::randint(n+1);
+ if (l > r) swap(l, r);
+#ifndef SEGTREE_FIRST_NEG
+# ifndef SEGTREE_MAX
+ ll comp = 0;
+# else
+ ll comp = numeric_limits<ll>::min();
+# endif
+#else
+ ll comp = numeric_limits<ll>::max();
+#endif
+ for (int j = l; j < r; j++) {
+#ifndef SEGTREE_FIRST_NEG
+# ifndef SEGTREE_MAX
+ comp += a[j];
+# else
+ comp = max(comp, a[j]);
+# endif
+#else
+ if (comp >= 0 && comp > a[j]) comp = a[j];
+#endif
+ }
+ assert(seg.query(l, r) == comp);
+ }
+#ifdef SEGTREE_MAX
+ {
+ int l = util::randint(n+1);
+ int r = util::randint(n+1);
+ if (l > r) swap(l, r);
+ ll bound = util::randint();
+ int found = -1;
+ for (int j = l; j < r; j++) {
+ if (a[j] >= bound) {
+ found = j;
+ break;
+ }
+ }
+ assert(seg.lower_bound(l, r, bound) == found);
+ }
+#endif
+ }
+}
+
+int main() {
+ test(1000);
+ test(1);
+ {
+#ifndef SEGTREE_INIT_DEFAULT
+ vector<ll> a;
+ SegTree seg(a);
+#else
+ SegTree seg(0);
+#endif
+ seg.update(0, 0, util::randint());
+#ifndef SEGTREE_FIRST_NEG
+# ifndef SEGTREE_MAX
+ assert(seg.query(0, 0) == 0);
+# else
+ assert(seg.query(0, 0) == numeric_limits<ll>::min());
+# endif
+#else
+ assert(seg.query(0, 0) == numeric_limits<ll>::max());
+#endif
+ }
+}