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: Accepted)

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

#define INF (int)1e9+7
#define rep(i,a,b) for(int i=a;i<b;++i)
#define rrep(i,a,b) for(int i=a;i>=b;--i)
#define vi vector<int>
#define vl vector<ll>
#define vvi vector<vector<int>>
#define vvl vector<vector<long long>>
#define pii pair<int,int>
#define pll pair<long,long>
#define vpii vector<pii>
#define vpll vector<pll>
//#define N 100005
#define pb push_back
#define mp make_pair
#define PI 3.1415926535897932384626433832795


ll powM(ll a,ll b,ll m )
{ 
  a%=m;
  ll ans=1;
  while(b>0)
  {
    if(b&1)ans=ans*a%m;
    a=a*a%m;
    b>>=1;
  }

return ans;
}

struct fjgkf{
bool operator()(const pair<ll,ll>& a,const pair<ll,ll>& b)const
{
 

  if(a.first<b.first)return true;
  if(a.first==b.first)return a.second>b.second;
  
  else return false;
}
};



int main()
{
   ios_base::sync_with_stdio(false);
    cin.tie(NULL);


ll n;cin>>n;
set<pair<ll,ll>,fjgkf>s;
vl a(n+1);
 
for(int i=1;i<=n;i++)
{
  cin>>a[i];
 // s.insert({a[i],i});
}
 
for(int i=1;i<=n;i++)
{
  s.insert({a[i],i});
  auto it=s.find({a[i],i});
 
  if(it!=s.begin())
  {
    advance(it,-1);
// cout<<"hi"<<" "<<(*it).first<<"\n";
    s.erase(it);
  }
}
 
//for(auto x:s)cout<<x.first<<" "<<x.second<<"\n";
 
 
cout<<s.size()<<"\n";


return 0;

}