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++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <iostream>
#include<string>
#include<cmath>
#include<algorithm>
#include<cctype>
#include<queue>
#include<deque>
#include<regex>
#include<stack>
#include<stdio.h>
#include<vector>
#include<set>
#include<map>
#include<iomanip>

#define rep(i, n) for(int i=0;i<n;i++)

typedef int long long ll;
using namespace std;
typedef pair<int, int> P;
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
const ll MOD = 1e9 + 7;
static const int MAX = 100;
static const int INF = (1 << 23);

template<class T>
T gcd(T a, T b) { return b ? gcd(b, a % b) : a; }

template<class T>
T lcm(T a, T b) { return a / gcd(a, b) * b; }


int main() {
    ll n;
    cin>>n;
    vector<ll> a(n);
    priority_queue<pair<ll,int>> q;
    rep(i,n){
        cin>>a[i];
        q.push({a[i],i});
    }



   vector<int> p;


    while(!q.empty()){
//        rep(k,p.size())cout<<p[k];
//        cout<<endl;
        auto x = q.top();q.pop();
        if(p.empty()){
            p.push_back(x.second);
        }else{
            sort(p.begin(),p.end());
            auto c = lower_bound(p.begin(),p.end(),x.second) - p.begin();
            bool f = false;
            //cout<<c<<" cc"<<endl;

            for(int i=c;i<p.size();i++){

                if(a[p[i]]>x.first) {
                    f = true;
                    p[c] = x.second;
                    break;
                }
            }
            if(!f) p.push_back(x.second);

           // cout<<c<<"aaa"<<endl;
//            if (c==p.size()){
//                p.push_back(x.second);
//            }else{
//                p[c] = x.second;
//            }
        }

    }
    cout<<p.size()<<endl;




    return 0;
}