using namespace std;
#include<iomanip>
#include<cmath>
#include<algorithm>
#include<vector>
#include<set>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<utility>
#include<cstdio>
#include<cstdlib>
#include<cassert>
#include<numeric>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<deque>
#define FILES
#ifdef FILES
#include<fstream>
ifstream cin("scmax.in");
ofstream cout("scmax.out");
#else
#include<iostream>
#endif
#define max3(a,b,c) max(a,max(b,c))
#define min3(a,b,c) min(a,min(b,c))
#define ALL(a) a.begin(),a.end()
#define p_b(a) push_back(a)
#define m_p(a,b) make_pair(a,b)
#define p_p(a,b) p_b(m_p(a,b))
typedef unsigned char uchar;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef queue<int> qint;
typedef pair<int,int> pii;
typedef queue<pii> qpii;
typedef vector<pii> vpii;
typedef vector<string> vstr;
typedef vector<ll> vll;
typedef deque<int> dqint;
typedef deque<ll> dqll;
typedef map<string,int> mpstri;
typedef map<int,int> mpinti;
typedef map<string,string> mpstrs;
typedef map<string,vstr> mpstrvs;
const int INFI=(1LL<<31)-1;
const ll INFL=(1LL<<62);
const double eps=1e-7;
const long double pi=acos(-1.0);
const int MAXN=100001;
int v[MAXN],u[MAXN],arb[4*MAXN],sl[MAXN];
void update(int nod,int lf,int rt,int pz,int vl){
arb[nod]=max(vl,arb[nod]);
if(lf==rt){
return;
}
int mid=(lf+rt)/2;
if(pz<=mid){
update(nod*2,lf,mid,pz,vl);
} else{
update(nod*2+1,mid+1,rt,pz,vl);
}
return;
}
int query(int nod,int lf,int rt,int les){
if(lf==rt){
return arb[nod];
}
int mid=(lf+rt)/2,mx=0;
if(les>mid){
mx=query(nod*2+1,mid+1,rt,les);
mx=max(mx,arb[nod*2]);
} else{
mx=max(mx,query(nod*2,lf,mid,les));
}
return mx;
}
int main(){
int n;
cin>>n;
mpinti key;
for(int i=1;i<=n;i++){
cin>>u[i];
v[i]=u[i];
}
sort(u+1,u+n+1);
for(int i=1;i<=n;i++){
if(key.find(u[i])==key.end()){
key[u[i]]=key.size();
}
}
for(int i=1;i<=n;i++){
v[i]=key[v[i]];
}
update(1,1,n,v[1],1);
sl[1]=1;
for(int i=2;i<=n;i++){
int mx=query(1,1,n,v[i]-1);
sl[i]=mx+1;
update(1,1,n,v[i],mx+1);
}
cout<<*max_element(sl+1,sl+n+1);
return 0;
}