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 <bits/stdc++.h>
#define ll long long int
#define ull unsigned long long int

using namespace std;



int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);cout.tie(NULL);
    ll N;
    cin>>N;
    vector<ll> arr(N);
    for(ll i=0;i<N;i++){
        cin>>arr[i];
    }
    ll j=0,mx=0;
    map<ll,vector<ll>> dict;
    dict[j].push_back(arr[0]);
    for(ll i=1;i<N;i++){

        if(dict[j][dict[j].size()-1]<arr[i]){
            dict[j].push_back(arr[i]);
        }
        else{
            j++;
            dict[j].push_back(arr[i]);
        }
    }
    ll c=0;
    vector<ll> r;
    //cout<<endl;
    //cout<<dict.size();
    for(ll i=0;i<=j;i++){
        if(dict[i].size()>1){
            c++;
        }
        else if(dict[i].size()==1)
            r.push_back(dict[i][0]);
    }
    map<ll,vector<ll>> di;

    if(r.size()>0){
        j=0;
        di[j].push_back(r[0]);
        for(ll i=1;i<r.size();i++){

            if(di[j][di[j].size()-1]<r[i]){
                di[j].push_back(r[i]);
            }
            else{
                j++;
                di[j].push_back(r[i]);
            }
        }
    }

    if(dict.size()==N)
        c=N;
    else if(dict.size()<N)
        c+=di.size();
    cout<<c;
    //5
    //4 1 2 3 2





    return 0;
}