Problem:
Score: 500 points

Problem Statement

Given is a permutation P of \{1, 2, \ldots, N\}.

For a pair (L, R) (1 \le L \lt R \le N), let X_{L, R} be the second largest value among P_L, P_{L+1}, \ldots, P_R.

Find \displaystyle \sum_{L=1}^{N-1} \sum_{R=L+1}^{N} X_{L,R}.

Constraints

2 \le N \le 10^5

1 \le P_i \le N

P_i \neq P_j (i \neq j)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
P_1 P_2 \ldots P_N

Output

Print \displaystyle \sum_{L=1}^{N-1} \sum_{R=L+1}^{N} X_{L,R}.

Sample Input 1

3
2 3 1

Sample Output 1

5

X_{1, 2} = 2, X_{1, 3} = 2, and X_{2, 3} = 1, so the sum is 2 + 2 + 1 = 5.

Sample Input 2

5
1 2 3 4 5

Sample Output 2

30

Sample Input 3

8
8 2 7 3 4 5 6 1

Sample Output 3

136

Solution in Java8 (OpenJDK 1.8.0) (judge verdict: Accepted)

import java.util.*;
import java.util.stream.*;
import java.io.*;

public class Main {

  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String[] in1 = br.readLine().split(" ");
    int N = Integer.parseInt(in1[0]);
    
    in1 = br.readLine().split(" ");
    int[] P = Stream.of(in1).mapToInt(Integer::parseInt).toArray();
    br.close();


    int[] posInP = new int[N];
    
    for(int i = 0; i < N; i++){
      P[i]--;
      posInP[P[i]] = i;
    }

    TreeSet<Integer> largeNumPos = new TreeSet<>();
    largeNumPos.add(-1);
    largeNumPos.add(N);
    largeNumPos.add(posInP[N-1]);
    long ans = 0;

    for(int i = N-2; i >= 0; i--){
      int j = posInP[i];
      int rLim1 = largeNumPos.higher(j);
      int lLim1 = largeNumPos.lower(j);

      int rLim2 = (rLim1 == N ? N : largeNumPos.higher(rLim1));
      int lLim2 = (lLim1 == -1 ? -1 : largeNumPos.lower(lLim1));
      if(rLim1 != N){
        ans += (long)(i + 1) * (long)(j - lLim1) * (long)(rLim2 - rLim1);
      }
      if(lLim1 != -1){
        ans += (long)(i + 1) * (long)(lLim1 - lLim2) * (long)(rLim1 - j);
      }

      largeNumPos.add(j);
    }

    System.out.println(ans);
  }
}