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: Accepted)

module IntSet = Set.Make (struct
  type t = int
  let compare = compare
end)

let () =
  let n = Scanf.scanf "%d\n" (fun n -> n) in
  let as_ = Array.init n @@ fun i -> Scanf.scanf "%d " @@ fun a -> i, a in
  Array.to_list as_
    |> List.sort (fun (_, a) (_, a') -> compare a a')
    |> List.fold_left (fun (acc, s) (j, a) ->
        let (lt, _, gt) = IntSet.split j s in
        let i = try IntSet.max_elt lt with Not_found -> -1 in
        let k = try IntSet.min_elt gt with Not_found -> n in
        (acc + (k - j) * (j - i) * a, IntSet.add j s)) (0, IntSet.empty)
    |> fst
    |> Printf.printf "%d\n"