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)