Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 22s
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.
39 lines
970 B
OCaml
39 lines
970 B
OCaml
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
|