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: Time Limit Exceeded)

/* while(!success_achieved())
      work_hard(); 

   code by:aman_ayush
  */
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ldb long double 
#define db double
#define str string

#define fr first
#define se second
#define lb lower_bound 
#define ub upper_bound 
#define pb push_back
#define mp make_pair
#define ins insert

#define pi pair<int,int>
#define pll pair<ll,ll>
#define pdb pair<db,db>
#define pldb pair<ldb,ldb>

#define vi vector<int>
#define vll vector<ll>
#define vdb vector<db>
#define vldb vector<ldb>
#define vpi vector< pi >
#define vpll vector< pll >

#define mi map<int,int>
#define mll map<ll,ll>
#define mdb map<db,db>
#define mldb map<ldb,ldb>


#define forr(a,b) for (int i = (a); i < (b); ++i)
#define rrof(i,a,b) for (int i = (b)-1; i >= (a); --i)

#define sz(x) (int)x.size()
#define all(x) begin(x), end(x)

const int MOD = 1e9+7;
const int MX = 2e5+5;
const ll inf =0x3f3f3f3f;
const ll linf=0x3f3f3f3f3f3f3f3f;
const ldb PI = 4*atan((ldb)1);

ll power(ll a,ll n)
{
 ll res=1;
 while(n)
{
 if(n%2)
  res*=a;
  a*=a;
  n/=2;
}
return res;
}

ll abs(ll a)
{
 return ((a<0)?(-1*a):(a));
}

int main()
{
    int n;
    cin>>n;
    int arr[n],pos[n+1];
    forr(0,n)
    {
        cin>>arr[i];
        pos[arr[i]]=i;
    }
    multiset<ll> ms;
    ms.ins(n);
    ms.ins(n);
    ms.insert(-1);
    ms.insert(-1);
    ms.ins(pos[n]);
    ll cnt=0;
    for(int i=n-1;i>=1;i--)
    {
        auto itr=ub(ms.begin(),ms.end(),pos[i]);
        int y=*itr;
        itr++;
        int z=*itr;
        itr--;
        itr--;
        int x=*itr;
        itr--;
        int w=*itr;
        //cout<<w<<" "<<x<<" "<<pos[i]<<" "<<y<<" "<<z<<"\n";
        cnt=cnt+i*((x-w)*(y-pos[i])+(z-y)*(pos[i]-x));
        //cout<<cnt<<"\n";
        ms.ins(pos[i]);
    }
    cout<<cnt<<"\n";
    return 0;
}