# 最长上升子序列 O(NlogN)做法
f[i]=x记录的是长度为i的上升子序列中,最后一个值最小的那个序列。那么f[]数组一定是递增的。
对于每个数y,使用二分法找到第一个大于y的f[i],将这个值更新为y,
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int a[maxn];
int f[maxn];
int cnt,n,x;
inline int find(int x){
int l=1,r=cnt,m;
while(l<r){
m=l+r>>1;
if(f[m]<x)l=m+1;
else r=m;
}
return l;
}
int main(){
cin>>n;
for(int i=0;i<n;++i)cin>>a[i];
f[++cnt]=a[0];
for(int i=1;i<n;i++){
x=a[i];
if(x>f[cnt])f[++cnt]=x;
else {
f[find(x)]=x;
}
}
cout<<cnt<<endl;
return 0;
}