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
#include <bits/stdc++.h>

#define pb push_back

using namespace std;

typedef long long ll;
typedef vector<ll> vll;

ll getResult(vll &v)
{
    vll items, result;
    for (int i = v.size() -1; i >= 0; --i) {
        int idx = lower_bound(items.begin(), items.end(), -v[i]) - items.begin();

        while (!items.empty() && -v[i] < items.back()) items.pop_back();

        if (idx >= items.size()) items.pb(-v[i]);
        else items[idx] = -v[i];

        result.pb(items.size());
    }

    ll mx = 0;
    for (int i = 0; i < result.size(); ++i) {
        mx = max(result[i], mx);
    }

    return mx;
}

int main()
{
    ios_base::sync_with_stdio(0);

    int n;
    cin >> n;

    vll v(2*n);
    for (int i = 0; i < n; ++i) {
        cin >> v[i];
        v[i+n] = v[i];
    }

    cout << getResult(v);
}