From 175a77fba586976d4919d89c4c0eee124ee75d65 Mon Sep 17 00:00:00 2001 From: giles Date: Sun, 10 May 2026 23:38:40 +0000 Subject: [PATCH] ocaml: phase 5.1 segment_tree.ml baseline (range-sum tree, fingerprint 4232) Power-of-two-indexed segment tree over [1;3;5;7;9;11;13;15]: build sums (root holds total = 64) query returns range sum in O(log n) update propagates a point delta back up the path Sequence: r1 = query [2,5] = 5 + 7 + 9 + 11 = 32 update idx 3 += 10 (so a[3] becomes 17) r2 = query [2,5] = 5 + 17 + 9 + 11 = 42 encoded fingerprint = r1 + r2*100 = 32 + 4200 = 4232 Tests three mutually independent recursive functions with array index arithmetic on 2*node / 2*node+1, half-bisection on mid = (l+r)/2, bottom-up combine pattern. 167 baseline programs total. --- lib/ocaml/baseline/expected.json | 1 + lib/ocaml/baseline/segment_tree.ml | 38 ++++++++++++++++++++++++++++++ plans/ocaml-on-sx.md | 9 +++++++ 3 files changed, 48 insertions(+) create mode 100644 lib/ocaml/baseline/segment_tree.ml diff --git a/lib/ocaml/baseline/expected.json b/lib/ocaml/baseline/expected.json index c6511a5d..f028eba3 100644 --- a/lib/ocaml/baseline/expected.json +++ b/lib/ocaml/baseline/expected.json @@ -141,6 +141,7 @@ "run_decode.ml": 21, "run_length.ml": 11, "safe_div.ml": 20, + "segment_tree.ml": 4232, "shuffle.ml": 55, "simpson_int.ml": 10000, "stable_unique.ml": 46, diff --git a/lib/ocaml/baseline/segment_tree.ml b/lib/ocaml/baseline/segment_tree.ml new file mode 100644 index 00000000..d878f996 --- /dev/null +++ b/lib/ocaml/baseline/segment_tree.ml @@ -0,0 +1,38 @@ +let n = 8 + +let st = Array.make (4 * n) 0 + +let rec build a l r node = + if l = r then st.(node) <- a.(l) + else begin + let mid = (l + r) / 2 in + build a l mid (2 * node); + build a (mid + 1) r (2 * node + 1); + st.(node) <- st.(2 * node) + st.(2 * node + 1) + end + +let rec query l r ql qr node = + if qr < l || ql > r then 0 + else if ql <= l && r <= qr then st.(node) + else begin + let mid = (l + r) / 2 in + query l mid ql qr (2 * node) + query (mid + 1) r ql qr (2 * node + 1) + end + +let rec update l r idx delta node = + if l = r then st.(node) <- st.(node) + delta + else begin + let mid = (l + r) / 2 in + if idx <= mid then update l mid idx delta (2 * node) + else update (mid + 1) r idx delta (2 * node + 1); + st.(node) <- st.(2 * node) + st.(2 * node + 1) + end + +;; + +let a = [| 1; 3; 5; 7; 9; 11; 13; 15 |] in +build a 0 (n - 1) 1; +let r1 = query 0 (n - 1) 2 5 1 in +update 0 (n - 1) 3 10 1; +let r2 = query 0 (n - 1) 2 5 1 in +r1 + r2 * 100 diff --git a/plans/ocaml-on-sx.md b/plans/ocaml-on-sx.md index 5b8a4a48..930aadcd 100644 --- a/plans/ocaml-on-sx.md +++ b/plans/ocaml-on-sx.md @@ -407,6 +407,15 @@ _Newest first._ binary search tree (`type 'a tree = Leaf | Node of 'a * 'a tree * 'a tree`) with insert + in-order traversal. Tests parametric ADT, recursive match, List.append, List.fold_left. +- 2026-05-10 Phase 5.1 — segment_tree.ml baseline (range-sum + segment tree over [1;3;5;7;9;11;13;15] with one point update, + encoded r1 + r2*100 = 4232). build/query/update use the standard + power-of-two indexing (node, 2·node, 2·node+1) over a flat + 4n-sized array. First range query 5+7+9+11=32; after adding 10 + to index 3, the same range = 5+17+9+11=42. Encoded: 32 + 42*100 + = 4232. Tests three mutually independent recursive functions + with array index arithmetic, half-bisection on `mid = (l + r) / 2`, + bottom-up combine pattern. 167 baseline programs total. - 2026-05-10 Phase 5.1 — magic_square.ml baseline (5×5 Siamese construction → main-diagonal sum 65, the magic constant for n=5). Place k=1 at (0, n/2); for each next k, move up-right with wrap-