import java.util.Scanner

object Main extends App { 
  val sc = new Scanner(System.in)
  val N = sc.nextInt()
  val an = (for (i <- 1 to N) yield sc.nextInt).toList

  val Inf = Int.MaxValue >> 1
  val memo = Array.fill(N)(Inf)

  def find(x:Int):Int = {
    def iter(l:Int,r:Int):Int = {
      if (l+1==r || l==r) l
      else {
        val i = (l + r) >> 1
        (x - memo(i)) match {
          case d if d  < 0 => iter(l, i)
          case d if d == 0 => i
          case d if d  > 0 => iter(i, r)
        }
      }
    }
    iter(0, N-1)
  }

  def solver(an:List[Int]):Int = {
    if (an.isEmpty) memo.filter(_!=Inf).length
    else {
      val e = an.head
      val i = find(e)
      if (memo(i) < e) memo(i+1) = e else memo(i) = e
      solver(an.tail)
    }
  }

  println(solver(an))
 
}
