#include <bits/stdc++.h>
using namespace std;
/*  function to returns minimum removals needed
 to make a mountain array */
int minMountainRemovals(vector<int> &a)
{
    /*  Declaring two dp vectors to store the maximum result for any indexing
        from left and right respectively */
    int n = a.size();
    vector<int> dpleft(a.size(), 1);
    vector<int> dpright(a.size(), 1);
    // vector<int> dpleft,dpright;
    
    /* declaring temporary vector lis
    it will help us to fill dpleft and dpright in nlongn complexity */
    vector<int> lis;
    // filing dpleft using lis in nlogn
    for (int i = 0; i < n; i++)
    {
        auto it = lower_bound(lis.begin(), lis.end(), a[i]);
        // if element is to be inserted in lis
        if (it != lis.end())
        {
            int idx = it - lis.begin();
            lis[idx] = a[i];
            dpleft[i] = idx + 1;
        }
        // if element in not present in lis insert at the end
        else
        {
            lis.push_back(a[i]);
            dpleft[i] = lis.size();
        }
    }
    
    // clearing lis vector to use to calculate right lis
    lis.clear();
    // reversing the original vector to calculate lis from back
    reverse(a.begin(), a.end());
    
    // filling dpright
    for (int i = 0; i < n; i++)
    {
        auto it = lower_bound(lis.begin(), lis.end(), a[i]);
        if (it != lis.end())
        {
            int idx = it - lis.begin();
            lis[idx] = a[i];
            dpright[i] = idx + 1;
        }
        // if element in not present in lis insert at end
        else
        {
            lis.push_back(a[i]);
            dpright[i] = lis.size();
        }
    }
    int longest = 0;
    
    // for every index check for longest mountain array,
    for (int i = 1; i < a.size() - 1; i++)
    {
        if (dpleft[i] >= 1 && dpright[i] >= 1)
        {
            int ans = dpleft[i] + dpright[i] - 1;
            longest = max(longest, ans);
        }
    }
    // returning removals
    return a.size() - longest;
}
int main()
{
    int n;
    cin >> n;
    // taking input for array size
    vector<int> a(n, 0);
    // Taking array input as vector
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    // calling minMountainRemovals function to return minimum number of       removals
    int removals = minMountainRemovals(a);
    cout << removals << endl;
    return 0;
}