Problem:
Score : 500 points

Problem Statement

You are given a sequence with N integers: A = \{ A_1, A_2, \cdots, A_N \}.
For each of these N integers, we will choose a color and paint the integer with that color. Here the following condition must be satisfied:

If A_i and A_j (i < j) are painted with the same color, A_i < A_j.

Find the minimum number of colors required to satisfy the condition.

Constraints

1 \leq N \leq 10^5

0 \leq A_i \leq 10^9

Input

Input is given from Standard Input in the following format:

N
A_1
:
A_N

Output

Print the minimum number of colors required to satisfy the condition.

Sample Input 1

5
2
1
4
5
3

Sample Output 1

2

We can satisfy the condition with two colors by, for example, painting 2 and 3 red and painting 1, 4, and 5 blue.

Sample Input 2

4
0
0
0
0

Sample Output 2

4

We have to paint all the integers with distinct colors.

Solution in Kotlin (1.0.0) (judge verdict: Wrong Answer)

import java.io.*
import java.util.*

fun solve(N: Int, A: IntArray) {
    val tree = TreeSet<Int>()
    tree.add(A[0])
    var count = 1
    val map = mutableMapOf<Int, Int>()
    for (n in 1 until N){
        map[A[n]] = map.getOrElse(A[n]){ 1 } + 1
        // println("${A[n]} ${tree} $map")
        if (A[n] <= tree.first()){ count++ }
        else{
            tree.lower(A[n])?.let{
                if (map.getOrElse(it){ 1 } == 1){
                    map.remove(it)
                    tree.remove(it)
                }else{
                    map[it] = map[it]!! - 1
                }
            }
        }
        tree.add(A[n])
    }
    println(count)
    return
}

fun main(args: Array<String>) {
    fun StringArray(size: Int, init: (Int) -> String = { "\u0000" }): Array<String> {
        return Array<String>(size, init)
    }
    class Scanner(stream: InputStream) {
        private val reader = BufferedInputStream(stream).bufferedReader()
        private var st: StringTokenizer? = null
        fun next(): String {
            while (!(st?.hasMoreTokens() ?: false)) st = StringTokenizer(reader.readLine())
            return st!!.nextToken()
        }
    }
    val sc = Scanner(System.`in`)
    val N = sc.next().toInt()
    val A = IntArray(N)
    for (i in 0 until N) {
        A[i] = sc.next().toInt()
    }
    solve(N, A)
}