fun main(args: Array<String>) = yorukatsu13e()

fun yorukatsu13e() {
    val n = readLine()!!.toInt()
    val aList = (1..n).map { readLine()!!.toInt() }

    val list = mutableListOf<Int>()

    fun lowerBound(list: List<Int>, key: Int): Int {
        var ok = list.size
        var ng = -1

        while (ok - ng > 1) {
            val mid = (ng + ok) / 2
            if (list[mid] >= key) ng = mid else ok = mid
        }
        return ok
    }

    for (a in aList) {
        val lowerBound = lowerBound(list, a)
        when (lowerBound) {
            in list.indices -> list[lowerBound] = a
            else -> list.add(a)
        }
    }

    val answer = list.size

    println(answer)
}
