let rec for_fold a b f v = if a >= b then v else for_fold (a+1) b f (f v a)
let rec pop v = function (y,_)::ys when y > v -> pop v ys | ys -> ys

let _ = Scanf.scanf "%d" @@ fun n ->
  let a = Array.init n (fun _ -> Scanf.scanf " %d" ((+) 0)) in
  let li = Array.make n (-1) in
  let _ : _ list = for_fold 0 n (fun stk i ->
    let x = a.(i) in
    let stk' = pop x stk in
    li.(i) <- (match stk' with [] -> -1 | (_,j)::_ -> j);
    (x, i)::stk') [] in

  let ri = Array.make n n in
  let _ : _ list = for_fold 0 n (fun stk i ->
    let i = n-1-i in
    let x = a.(i) in
    let stk' = pop x stk in
    ri.(i) <- (match stk' with [] -> n | (_,j)::_ -> j);
    (x, i)::stk') [] in

  for_fold 0 n (fun s i ->
    Printf.printf "-- %d %d %d %d\n" i a.(i) li.(i) ri.(i);
    s + a.(i) * (i - li.(i)) * (ri.(i) - i)) 0
  |> Printf.printf "%d\n"