#include <iostream>
#include <vector>
using namespace std;

typedef struct
{

    int height;//每次输入的身高数据
    int length_up;//到输入该数据为止递增的最大子序列长度
    int length_down;//到输入该数据为止开始递减或已经在递减的最大子序列长度(即先增后减的子序列)
}student;

int main() 
{
    
    int N;
    while (cin >> N)
    {

        vector<student> students;
        for (int i = 0; i < N; i++)
        {

            student temp;
            cin >> temp.height;//输入新数据
            temp.length_up = 1;//输入新数据的初始递增序列仅包含自己,故设为1
            temp.length_down = 1;//输入新数据的初始递减序列仅包含自己,故设为1
            if (i == 0) students.push_back(temp);//对于动态规划的初始设置(即对第一个数据进行预设并直接输入)
            else
            {

                for (int j = students.size() - 1; j >= 0; j--)
                {

                    if (students[j].height < temp.height && students[j].length_up >= temp.length_up) temp.length_up = students[j].length_up + 1;//当新数据的身高比正在比较的当前数据的身高更高时,当前数据仅有递增的可能性,于是循环求出最大的递增子序列
                    if (students[j].height > temp.height && (students[j].length_down >= temp.length_down || students[j].length_up >= temp.length_down)) temp.length_down = max(students[j].length_up + 1, students[j].length_down + 1);//当新数据的身高比正在比较的当前数据的身高更低时,当前数据有递增或递减两种可能性,于是循环求出两种可能性中最大的递减子序列
                }//遍历之前的数据,找出递增、递减的最大子序列并据此计算新数据的最大子序列
                students.push_back(temp);
            }
        }//由动态规划,每输入一个数据,计算新状态下的最优解,共输入N次,故有N次循环

        int maxlength = 1;
        for (vector<student>::iterator iter = students.begin(); iter != students.end(); iter++)
        {

            if (maxlength < iter->length_up) maxlength = iter->length_up;
            if (maxlength < iter->length_down) maxlength = iter->length_down;
        }//找到符合题意的最大序列
        cout << N - maxlength << endl;
    }

    return 0;
}