#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define rep(x, s, t) for(llint (x) = (s); (x) <= (t); (x)++) #define chmin(x, y) (x) = min((x), (y)) #define chmax(x, y) (x) = max((x), (y)) #define all(x) (x).begin(),(x).end() #define inf 1e18 using namespace std; typedef long long llint; typedef long long ll; typedef pair P; struct BIT{ int size; vector bit; BIT(){size = 0;} BIT(int s){ size = s; bit.resize(size+1); init(); } void init(){ for(int i = 1; i <= size; i++) bit[i] = 0; } llint query(int i){ llint ret = 0; while(i > 0){ ret += bit[i]; i -= i&(-i); } return ret; } void add(int i, llint x){ while(i <= size){ bit[i] += x; i += i&(-i); } } }; ll n; ll a[200005]; vector avec[200005], qvec[200005]; BIT bit(200005); bool check(ll a, ll b, ll c) { if(a == b || b == c || c == a) return false; if(a > b && b < c) return true; if(a < b && b > c) return true; return false; } bool calc(ll x) { if(x <= 1 || x >= n) return true; return check(a[x-1], a[x], a[x+1]); } int main(void) { ios::sync_with_stdio(0); cin.tie(0); cin >> n; rep(i, 1, n) cin >> a[i]; ll ans = 0; rep(i, 2, n-1){ ll l, h; if(a[i-1] < a[i]){ l = max(a[i-1], a[i+1]), h = a[i]; avec[h].push_back(l); qvec[l].push_back(h); } } for(int i = n; i >= 1; i--){ for(auto q : qvec[i]) ans += bit.query(q-1);//, cout << i << " " << q << endl; for(auto q : avec[i]) bit.add(q, 1); //rep(j, 0, n) cout << bit.query(j) << " "; cout << endl; } //cout << ans << endl; bit.init(); rep(i, 1, n) avec[i].clear(), qvec[i].clear(); rep(i, 2, n-1){ ll l, h; if(a[i-1] > a[i]){ h = min(a[i-1], a[i+1]), l = a[i]; avec[h].push_back(l); qvec[l].push_back(h); } } for(int i = n; i >= 1; i--){ for(auto q : qvec[i]) ans += bit.query(q-1); for(auto q : avec[i]) bit.add(q, 1); } ans -= n-2; ans /= 2; bit.init(); rep(i, 1, n) avec[i].clear(), qvec[i].clear(); rep(i, 2, n-1){ ll l, h; if(a[i-1] < a[i]){ l = max(a[i-1], a[i+1]), h = a[i]; qvec[h].push_back(l); }else{ h = min(a[i-1], a[i+1]), l = a[i]; avec[h].push_back(l); } } for(int i = n; i >= 1; i--){ for(auto q : qvec[i]) ans += bit.query(n) - bit.query(q); for(auto q : avec[i]) bit.add(q, 1); } rep(i, 2, n){ swap(a[1], a[i]); bool flag = true; rep(j, -1, 1) flag &= calc(1+j) && calc(i+j); if(flag) ans++; swap(a[1], a[i]); } rep(i, 2, n-1){ swap(a[n], a[i]); bool flag = true; rep(j, -1, 1) flag &= calc(n+j) && calc(i+j); if(flag) ans++; swap(a[n], a[i]); } cout << ans << endl; return 0; }