Problem:
Score : 400 points

Problem Statement

One day, Snuke was given a permutation of length N, a_1, a_2, ..., a_N, from his friend.

Find the following:

Constraints

1 ≦ N ≦ 200,000

(a_1, a_2, ..., a_N) is a permutation of (1, 2, ..., N).

Input

The input is given from Standard Input in the following format:

N
a_1 a_2 ... a_N

Output

Print the answer.

Note that the answer may not fit into a 32-bit integer.

Sample Input 1

3
2 1 3

Sample Output 1

9

Sample Input 2

4
1 3 2 4

Sample Output 2

19

Sample Input 3

8
5 4 8 1 2 6 7 3

Sample Output 3

85

Solution in OCaml (4.02.3) (judge verdict: Wrong Answer)

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"