package main

import (
	"fmt"
	// "bufio"
	// "os"
	// "strings"
)

// 求最少出队人数,也就是求最多留队人数,计算每个人左边和右边最多站几个人,就可以得到哪个人的左边+右边最大,再加上自己,就是最多可以站下的人数
func main() {
    // 学生数量和身高数据
    var count int
    // var inputText string
    fmt.Scan(&count)


    // reader := bufio.NewReader(os.Stdin)
    // inputText, _ = reader.ReadString('\n')
    // inputText = strings.TrimSpace(inputText)
    // inputText = strings.TrimSuffix(inputText, "\n")
    // heightSlice := strings.Split(inputText, " ")

    // 好苦呀,为什么上面这种处理方式,执行结果是错的呀。。。。。。。。。。
    heightSlice := make([]int, count)
    for {
        for i := 0; i < count; i++ {
            fmt.Scan(&heightSlice[i])
        }
        break
    }
    leftSlice := make([]int, count)
    // 以每个人为中心,计算他左边最多站几个人
    for i := 1; i < count; i++ {
        // 循环当前人左边所有人,所以是j<i;
        for j := 0; j < i; j++ {
            // 如果当前人身高大于左边某个人,并且当前人循环至此时 他的左边最大人数 小于 j的。那要替换i的数量
            if heightSlice[i] > heightSlice[j] && leftSlice[i] < leftSlice[j] + 1 {
                // 符合条件,当前人左边最大人数,就是i的左边最大人数
                leftSlice[i] = leftSlice[j] + 1
            }
        }
    }

    rightSlice := make([]int, count)
    // 以每个人为中心,计算他右边边最多站几个人
    for i := count-2; i >= 0; i-- {
        for j := count-1; j > i; j-- {
            if heightSlice[i] > heightSlice[j] && rightSlice[i] < rightSlice[j] + 1 {
                rightSlice[i] = rightSlice[j] + 1
            }
        }
    }

    max := 0
    for i := 0; i < count; i++ {
        if (leftSlice[i] + rightSlice[i] + 1) > max {
            max = leftSlice[i] + rightSlice[i] + 1
        }
    }

    fmt.Println(count - max)
}