#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
#include <algorithm>
#include <string>
#include <iomanip>
#include <cstring>
#include <map>
#include <iomanip>
#include <unordered_map>
#include <stack>
#include <bitset>
#define MOD 8192
#define pb push_back
#define INF 0x3f3f3f3f
#define ll long long
#define NMAX 100003
#define KMAX 33
using namespace std;
typedef pair<int, int> pii;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
pii v[NMAX];
int aint[4*NMAX];
void update_aib(int nod, int st, int dr, int pos, int val) {
if(st==dr) {
aint[nod]=max(aint[nod],val);
return;
}
int mid=(st+dr)/2,fs=(nod<<1);
if(pos<=mid) update_aib(fs,st,mid,pos,val);
else update_aib(fs+1,mid+1,dr,pos,val);
aint[nod]=max(aint[fs],aint[fs+1]);
}
int query_aib(int nod, int st, int dr, int qst, int qdr) {
if(dr<qst || st>qdr) return 0;
if(qst<=st && qdr>=dr) return aint[nod];
int mid=(st+dr)/2,fs=(nod<<1);
//query_aib(fs,st,mid,qst,qdr);
//query_aib(fs+1,mid+1,dr,qst,qdr);
return max(query_aib(fs,st,mid,qst,qdr), query_aib(fs+1,mid+1,dr,qst,qdr));
}
bool comp(pii A, pii B) {
if(A.first==B.first) return A.second>B.second;
else return A<B;
}
int main() {
int n,i,maxstanga,x,res=0;
fin>>n;
for(i=1;i<=n;++i) {
fin>>x;
v[i]={x,i};
}
sort(v+1,v+n+1,comp);
for(i=1;i<=n;++i) {
maxstanga=query_aib(1,1,n,1,v[i].second);
res=max(res,maxstanga+1);
update_aib(1,1,n,v[i].second,maxstanga+1);
//cout<<v[i].first<<' '<<v[i].second<<' '<<res<<'\n';
}
fout<<res;
return 0;
}