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 Java (OpenJDK 11.0.6) (judge verdict: Accepted)

import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // Your code here!
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
        
        // 1.値を次のルールで集合に追加する。
        // rule: 自分より小さい値がいれば、自分に最も近い値を自分に書き換える。
        //       いない場合は、誰も書き換えず自分を追加する。
        // 2.「1」を計n回繰り返す。
        // 3.集合のサイズを出力する。
        // ex. {2, 1, 4, 5, 3} =>
        // {2} -> {1,2} -> {1,4} -> {1,5} -> {3,5} ans = 2;
        
        while (n-- > 0) {
            int num = sc.nextInt();
            
            if (map.lowerKey(num) == null) {
                int val = map.getOrDefault(num, 0);
                map.put(num, ++val);
            } else {
                int key = map.lowerKey(num);
                int val = map.get(key);
                if (val == 1) {
                    map.remove(key);
                } else {
                    map.put(key, --val);
                }
                val = map.getOrDefault(num, 0);
                map.put(num, ++val);
            }
        }
        
        int ans = 0;
        for (Integer key : map.keySet()) {
            int val = map.get(key);
            ans += val;
        }
        System.out.println(ans);
    }
}