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 C# (Mono 4.6.2.0) (judge verdict: Accepted)

using System;
using System.Linq;
using System.Collections.Generic;
using static System.Console;
using System.Text;
using System.IO;

namespace AtCoder_Beginner_Contest_134
{
    class Program
    {
        static public long[] Sarray() { return ReadLine().Split().Select(long.Parse).ToArray(); }
        static public List<long> Slist() { return ReadLine().Split().Select(long.Parse).ToList(); }
        static void Main(string[] args)
        {
            SetOut(new StreamWriter(OpenStandardOutput()) { AutoFlush = false });
            Solve();
            Out.Flush();
        }
        static void Solve()
        {
            var N = Sarray()[0];
            var col = new List<long>() { -1 };
            for (var i = 0; i < N; ++i)
            {
                var ai = Sarray()[0];
                if (col[col.Count - 1] >= ai)
                { col.Add(ai); }
                else if (ai > col[0])
                {
                    col[0] = ai;
                }
                else
                {
                    var idx = binary_search(col, ai, 1, col.Count - 1);
                    while (col[idx] == ai)
                        ++idx;
                    col[idx] = ai;
                }
            }
            WriteLine(col.Count);
        }
        static int binary_search(List<long> lst, long key, long min, long max)
        {
            if (max < min)
                return (int)min;

            var mid = min + (max - min) / 2;
            if (key > lst[(int)mid])
            {
                return binary_search(lst, key, min, mid - 1);
            }
            if (lst[(int)mid] > key)
            {
                return binary_search(lst, key, mid + 1, max);
            }
            if (mid == lst.Count - 1)
                return (int)mid;
            if (lst[(int)mid] == lst[(int)mid + 1])
                return binary_search(lst, key, mid + 1, max);
            return (int)mid;
        }
    }
}