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 C++14 (GCC 5.4.1) (judge verdict: Accepted)

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define FOR(i, a, b) for(int i=(a);i<(b);++i)
#define rep(i, n) FOR(i, 0, n)
#define whole(x) (x).begin(),(x).end()
#define UNIQUE(v) v.erase(unique(v.begin(), v.end()), v.end())

using P = pair<int, int>;
#define debug(var) cout << "[" << #var << "] " << var << endl
const ll mod = 1000000007;


int main(){
    int n;
    cin >> n;
    vector<int> p(n);
    vector<int> pos(n);
    rep(i, n) {
        cin >> p[i];
        pos[p[i]-1] = i;
    }
    
    set<int> s;
    ll ans = 0;

    for (int i=n-1; i>=0; i--) {
        int x = pos[i];
        if (s.size()==0) {
            s.insert(x);
            continue;
        }
        auto it = s.upper_bound(x);
        ll l1, l2, r1, r2;
        if (it!=s.end()) {
            r1 = *it;
            it++;
            if (it!=s.end()) {
                r2 = *it;
            }
            else {
                r2 = n;
            }
            it--;
        }
        else {
            r1 = n;
            r2 = n;
        }
        if (it!=s.begin()) {
            it--;
            l2 = *it;
            if (it!=s.begin()) {
                it--;
                l1 = *it;
            }
            else {
                l1 = -1;
            }
        }
        else {
            l1 = -1;
            l2 = -1;
        }
        ans += (l2-l1) * (r1-x) * (i+1);
        ans += (r2-r1) * (x-l2) * (i+1);
        s.insert(x);
        //debug(ans);
    }
     
    
    
    
    
    cout << ans << endl;
    return 0;
}