type tree = Leaf | Node of tree * int * tree
let rec max_sum = function
| Leaf -> 0
| Node (l, x, r) -> x + max (max_sum l) (max_sum r)
let make_tree n tab =
let rec aux flr i =
if flr == n then Leaf
else let nxt_flr = flr + 1 in
let nxt_i = i + nxt_flr in
Node (aux nxt_flr nxt_i,
tab.(i),
aux nxt_flr (nxt_i+1))
in aux 0 0
let pyramides_naif n tab =
max_sum (make_tree n tab)
(* cette fonction fait tout en une fois
ce qui évite la création coûteuse de l'arbre *)
let pyramides n tab =
let rec aux flr i =
if flr == n then 0
else let nxt_flr = flr + 1 in
let nxt_i = i + nxt_flr in
tab.(i) + max (aux nxt_flr nxt_i)
(aux nxt_flr (nxt_i + 1))
in aux 0 0
let _ =
let n = read_int () in
let numbers = Array.init ((n*(n+1))/2)
(fun _ -> Scanf.scanf "%d " (fun x -> x))
in print_int (pyramides n numbers)