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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String [] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        long [] a = new long[n];
        for (int i = 0; i < n; ++i) {
            a[i] = scanner.nextLong();
        }
        List<List<Long>> numbers = new ArrayList<>();
        List<Long> first = new ArrayList<>();
        List<Long> last = new ArrayList<>();
        for (int i = 0; i < n; ++i) {
            int pos = Collections.binarySearch(
                    first, a[i]
            );
            if (pos >= 0 && pos < first.size()) {
                ArrayList<Long> currentList = new ArrayList<>();
                currentList.add(a[i]);
                numbers.add( currentList);
                first.add(a[i]);
                last.add(a[i]);
                continue;
            }
       //     System.out.println("current: " + a[i]);
            pos = -1 * (pos + 1);
            int former = pos - 1;
        //    System.out.println("pos: " + pos);
            if (pos == 0) {
                ArrayList<Long> currentList = new ArrayList<>();
                currentList.add(a[i]);
                numbers.add(0, currentList);
                first.add(0, a[i]);
                last.add(0, a[i]);
            } else {
                int value = Collections.binarySearch(
                        last.subList(0, pos),
                        a[i]
                );
                if (0 <= value && value < pos) {
                    ArrayList<Long> currentList = new ArrayList<>();
                    currentList.add(a[i]);
                    numbers.add(currentList);
                    first.add(a[i]);
                    last.add(a[i]);
                }
                value = -1 * (value + 1);
   //             System.out.println("value: " + value);
                if (value >= pos && last.get(former) >= a[i]) {
                    ArrayList<Long> currentList = new ArrayList<>();
                    currentList.add(a[i]);
                    numbers.add(currentList);
                    first.add(a[i]);
                    last.add(a[i]);
                } else {

                    numbers.get(pos - 1).add(a[i]);
                    first.set(pos - 1, a[i]);
                    last.set(pos - 1, a[i]);
                }
            }
//            numbers.forEach(
//                    nums -> {
//                        nums.forEach(
//                                num -> System.out.print(" " + num)
//                        );
//                        System.out.println();
//                    }
//            );
        }
        System.out.println(numbers.size());
    }
}