#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;
}