#include<bits/stdc++.h>
#pragma GCC optimize(2)
#define ll long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,n,a) for(int i=n;i>=a;i--)
#define endl '\n'
#define eps 0.000000001
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const int maxn=1e5+5;
int a[maxn],g[maxn],dp[maxn];
int main(){
int n;scanf("%d",&n);
rep(i,1,n) scanf("%d",&a[i]);
mem(g,INF);int ans=-1;
for(int i=1;i<=n;i++){
int pos=lower_bound(g+1,g+n+1,a[i])-g;
dp[i]=pos;
if(ans<dp[i]) ans=dp[i];
g[pos]=a[i];
}
cout<<ans<<endl;
}