#include <bits/stdc++.h>
#define GOOD_LUCK ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define int long long
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
constexpr int MAX = 2e+5 + 1, INF = 2e+16, MOD = 1e+9 + 7, K = 31;
int compress(vector <int> &v) {
    int n = v.size();
    vector <pair<int, int>> x;
    for (int i=0; i < n; i++) x.pb({v[i], i});
    sort(all(x));
    int nxt=1;
    for (int i=0; i < n-1; i++) {
        if (x[i].ff == x[i+1].ff) x[i].ff = nxt;
        else x[i].ff = nxt++;
    }
    x.back().ff = nxt;
    for (auto &i : x) v[i.ss] = i.ff;
    return nxt;
}
struct SegTree{
    int n;
    vector <int> a, t;
    void init(int n1) {
        n = n1;
        t.assign(4*(n+2), 0);
    }
    int merge(int a, int b) {
        return a + b;       // TODO
    }
    int find(int v, int tl, int tr, int l, int r) {
        if (l > r) return 0;      // TODO
        if (tl == l && tr == r) return t[v];
        int tm = (tl + tr) / 2;
        int r1 = find(v*2, tl, tm, l, min(r, tm));
        int r2 = find(v*2+1, tm+1, tr, max(l, tm+1), r);
        return merge(r1, r2);
    }
    void update(int v, int tl, int tr, int i, int x) {
        if (tl == tr) {
            t[v] = x;
            return;
        }
        int tm = (tl + tr) / 2;
        if (i <= tm) update(v*2, tl, tm, i, x);
        else update(v*2+1, tm+1, tr, i, x);
        t[v] = merge(t[v*2], t[v*2+1]);
    }
    int get(int l, int r) {
        return find(1, 0, n-1, l, r);
    }
    void upd(int i, int x) {
        update(1, 0, n-1, i, x);
    }
};
void _() {
    int n;
    cin >> n;
    vector <int> v(n);
    for (int &i : v) cin >> i;
    compress(v);
    SegTree t;
    t.init(n+1);
    vector <int> dp(n, INF);
    dp[0] = 1;
    t.upd(v[0], 1);
    for (int i = 1; i < n; i++) {
        dp[i] = dp[i-1] + 1;
        for (int j = i-1; j >= 0; j--) {
            if (v[j] <= v[j+1] && t.get(v[j]+1, v[i]-1) == 0) {
                dp[i] = min(dp[i], (j == 0 ? 0 : dp[j-1]) + 1);
            }
            else break;
        }
        t.upd(v[i], 1);
    }
    // cerr << endl;
    // for (int &i : dp) cerr << i << ' ';
    cout << dp[n-1];
    
}
signed main() {
    GOOD_LUCK
    int tests=1;
    // cin >> tests;
    for (int i=1; i <= tests; i++) {
        _();
        cout << endl;
    }
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |