1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<bits/stdc++.h>
 
#define pb push_back
#define ppb pop_back
#define eb emplace_back
#define ff first
#define ss second
#define turbo ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define mid ((l+r)/2)
#define midLL ((l+r)/2LL)
#define mide ((lo+hi)/2)
#define mideLL ((lo+hi)/2LL)
#define endl '\n'
#define random_shuffle shandom_ruffle
#define lowbit(x) x&(-x)
#define bits(x) __builtin_popcount(x) 
#define mins(se) (*se.begin())
#define maxs(se) (*--se.end())
#define all(x) x.begin(), x.end()
#define log2_floor(i) (i ? __builtin_clzll(1) - __builtin_clzll(i) : -1)
#define siz(cont) ((int)cont.size())
#define each(it, cont) for(auto &it : cont)
#define ein(cont) for(auto &it : cont) cin >> it;
#define mp(a, b) make_pair(a, b)

using ll = long long;
using pii = std::pair<int, int>;
using pll = std::pair<ll, ll>;
using pli = std::pair<ll, int>;
using pil = std::pair<int, ll>;
using vll = std::vector<pll>;
using vii = std::vector<pii>;
using vi = std::vector<int>;
using vl = std::vector<ll>;
using vvl = std::vector<vl>;
using vvi = std::vector<vi>;
using vvii = std::vector<vii>;
using vli = std::vector<pli>;
using vvli = std::vector<vli>;
using vil = std::vector<pil>;
using vvil = std::vector<vil>;
using vc = std::vector<char>;
using vvc = std::vector<std::vector<char>>;
using vb = std::vector<bool>;
using vvb = std::vector<vb>;

#ifdef JDKURWE
void err() { std::cout << "\n"; fflush(stdout); }
template<class T, class... Ts>
void err(T arg, Ts &... args) {
    std::cout << arg << ' ';
    err(args...);
}
#else 
void err() {}
template<class T, class... Ts>
void err(T arg, Ts &... args) {
    err(args...);
}
#endif

using namespace std;

signed main() { 
    turbo;
    int n; cin >> n;
    vi v(n), mxsuf(n), dlsuf(n);
    ein(v);

    vi mo;
    for (int i = n-1; i >= 0; i--) {
        while (!mo.empty() and mo.back() <= v[i])
            mo.ppb();
        mo.pb(v[i]);
        mxsuf[i] = mo[0];
        dlsuf[i] = siz(mo);
    }

    int ind = 0, res = 0;
    mo.clear();
    for (int i = 0; i < n; i++) {
        while (ind < siz(mo) and mo[ind] <= mxsuf[i])
            ind++;
        while (ind-1 >= 0 and mo[ind-1] > mxsuf[i])
            ind--;

        res = max(res, dlsuf[i]+siz(mo)-ind);
        if (mo.empty() or v[i] > mo.back())
            mo.pb(v[i]);
    }
    cout << res;
}