/*
LIS within O(nlogn)
Program by Alex
2007-09-02 21:30
*/
#include <stdio.h>
#define maxn 10000+1
int minval[maxn],list[maxn],d[maxn];
int n;
int find(int a,int b,int v){
if(a==b) return a;
int mid=(a+b)/2;
if(v<=minval[mid]) return find(a,mid,v);
return find(mid+1,b,v);
}
int main(){
freopen("lis.in","r",stdin);
freopen("lis.out","w",stdout);
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d",&list[i]);
for(i=1;i<=n;i++)
minval[i]=0x7fffffff;
int prelength,best;
for(i=1;i<=n;i++){
prelength=find(1,i,list[i]);
d[i]=prelength+1;
minval[d[i]]=list[i];
if(d[i]>best) best=d[i];
}
printf("%d",best);
return 0;
}
LIS within O(nlogn)
Program by Alex
2007-09-02 21:30
*/
#include <stdio.h>
#define maxn 10000+1
int minval[maxn],list[maxn],d[maxn];
int n;
int find(int a,int b,int v){
if(a==b) return a;
int mid=(a+b)/2;
if(v<=minval[mid]) return find(a,mid,v);
return find(mid+1,b,v);
}
int main(){
freopen("lis.in","r",stdin);
freopen("lis.out","w",stdout);
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
scanf("%d",&list[i]);
for(i=1;i<=n;i++)
minval[i]=0x7fffffff;
int prelength,best;
for(i=1;i<=n;i++){
prelength=find(1,i,list[i]);
d[i]=prelength+1;
minval[d[i]]=list[i];
if(d[i]>best) best=d[i];
}
printf("%d",best);
return 0;
}