import java.util.* ;
public class Main{
    public static void main(String...args) {
        Scanner sc = new Scanner(System.in) ;
        while(sc.hasNextLine()) {
            int n = sc.nextInt() ;
            sc.nextLine() ;
            int[] arr = new int[n] ;
            for(int i = 0 ; i < n ; i ++) {
                arr[i] = sc.nextInt() ;
            }
            sc.nextLine() ;
            System.out.println(solu(arr)) ;
        }
    }
    public static int solu(int arr[]) {
        int[] up = maxUp(arr) ;//上升
        //将数组反转,再求最长上升子序列,再反转,就成了以每个i为开始的最长下降子序列长度
        reverse(arr) ;
        int dow[] = maxUp(arr) ;
        reverse(dow) ;//下降
        int max = -1 ;
        for(int i = 0 ; i < arr.length ; i ++) {
            //i左边和右边都满足条件的最大长度
            int temp = up[i]+dow[i] -1 ;
            if(temp > max) {
                max = temp ;
            }
        }
        //原长度减去求出来的最大长度就成了移除得到最少个数
        return arr.length - max ;
    }
    //动态规划求最长上升子序列
    public static int[] maxUp(int[] arr){
        int s = 0 ;
        int e = arr.length-1 ;
        //f1[i]表示i位置结尾的左边最长上升子序列长度
        int f[] = new int[arr.length] ;
        f[0] = 1 ;
        for(int i = 1 ; i <= e ; i ++) {
            //转移方程:f[i] = max{f[k]}+1,arr[k]<arr[i]
            int max = 0 ;
            for(int j = 0 ; j < i ; j ++) {
                if(arr[j] < arr[i]) {
                    if(f[j] > max) {
                        max = f[j] ;
                    }                    
                }
        }
            f[i] = max + 1 ;
        }
       return f ;
   
    }
    public static void reverse(int arr[]) {
        int i = 0 ; 
        int j = arr.length-1 ;
        while(i < j) {
            int t = arr[j] ;
            arr[j] = arr[i] ;
            arr[i] = t ;
            i++;
            j-- ;
        }
    }
}