#include<bits/stdc++.h>
using namespace std;
#define maxn 1000
//最长上升子序列
//方法1:(时间复杂度 O(N^2))
//dpi:以位置i为结尾的最长递增子序列的长度
int dpmaxn;
int arrmaxn;
int ans=1;
void solve1(int n){
for(int i=0;i<n;i++) dpi=1;
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){
if(arri>arrj){
dpi=max(dpi,1+dpj);
if(dpi>ans) ans=dpi;
}
}
}
cout<<"ans = "<<ans<<endl;
}
//方法2:时间复杂度O(N*log N)
//endi:长度为i+1子序列的最小结尾
int endssmaxn;
int len=0;//len为end数组的实际大小,也是答案所在
//bs函数:用来搜索endss数组中比arri小(不能相等)的第一个元素下标(从右往左算的话)
//举个例子:现在arri==7
//endss3 6 8
//下标 0 1 2 len
//bs就是要找6的下标(大小最接近 arri且比 arri 小)
//而因为endss数组本质上具有单调性的,所以用二分搜索
int bs(int num){
if(endss0>=num) return -1;
int l=0,r=len-1;
while(l<=r){
int m=(l+r)/2;
if(endssm>=num){
r=m-1;
}else{
l=m+1;
}
}
return l-1;
}
void solve2(int n){
endss0=arr0;
len++;
for(int i=1;i<n;i++){
if(arri>endsslen-1){
endsslen++=arri;
}else{
int find=bs(arri);
if(find != -1){
endss++find=arri;
}else{
endss0=arri;
}
}
}
cout<<"len = "<<len<<endl;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++) cin>>arri;
solve1(n);
solve2(n);
return 0;
}