Link to this code: https://cses.fi/paste/902973a8389f6ae2c6bd6a/
/*
    Author : detective conan
    Problem : Mountain Range
    Created : 24/05/2025 09:43 UTC+7
*/
#include <bits/stdc++.h>
#define FOR(i, s, t) for(int i = s; i <= t; ++i)
#define rep(i, s, t) for(int i = s; i >= t; --i)
#define FPOR(i, s, t, c) for(int i = s; i <= t; i += c)
#define rmep(i, s, t, c) for(int i = s; i >= t; i -= c)
#define FMOR(i, s, t, c) for(int i = s; i <= t; i *= c)
#define rdep(i, s, t, c) for(int i = s; i >= t; i /= c)
#define HAVE_TESTCASE false
#define ANS(n, s) cout << n << s
#define pii pair<int, int>
#define tiii tuple<int, int, int>
#define P pair
#define T tuple
#define vec vector
#define all(a) a.begin(), a.end()
#define great(a) a, vec<a>, greater<a>
#define F first
#define S second
#define pout(n) cout << n.F << ' ' << n.S << '\n';
#define conan cin.tie(nullptr)->sync_with_stdio(false)
#define eb emplace_back
#define pb push_back
#define ppb pop_back
#define pf push_front
#define ppf pop_front
#define lbv(a, m) lower_bound(all(a), m) - a.begin()
#define upv(a, m) upper_bound(all(a), m) - a.begin()
#define lb lower_bound
#define ub upper_bound
 
using namespace std;
using u32 = unsigned;
using i64 = int64_t;
using u64 = uint64_t;

int n, a[200100], dp[200200], ans = -1;
stack<pii> stk;
vec<int> vc[200200];

int dfs(int u){
    if(dp[u]) return dp[u];
    for(auto v:vc[u]) dp[u] = max(dp[u], dfs(v) + 1);
    return dp[u];
}

void solve(){
    cin >> n;
    FOR(i, 1, n) cin >> a[i];
    FOR(i, 1, n){
        while(!stk.empty() && stk.top().S < a[i]) vc[i].pb(stk.top().F), stk.pop();
        stk.emplace(i, a[i]);
    }
    while(!stk.empty()) stk.pop();
    rep(i, n, 1){
        while(!stk.empty() && stk.top().S < a[i]) vc[i].pb(stk.top().F), stk.pop();
        stk.emplace(i, a[i]);
    }
    FOR(i, 1, n) ans = max(ans, dfs(i) + 1);
    cout << ans;
}

int main(){
    conan;
    int t = 1;
    if(HAVE_TESTCASE) cin >> t;
    while(t--) solve();
}