#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+5,lg=30;intchild[N*lg][2],dp[2*N*lg];intsz=1;intget_bit(intx,inti){return(x>>i)&1;}voidinsert(intx,intval){intp=1;for(inti=lg-1;i>=0;i--){intbit=get_bit(x,i);if(!child[p][bit]){child[p][bit]=++sz;}p=child[p][bit];dp[p]=max(dp[p],val);}}// Max dp value for all nodes that are < x.
intquery(intx){intp=1,ans=0;for(inti=lg-1;i>=0;i--){intbit=get_bit(x,i);if(bit){intlchild=child[p][0];ans=max(ans,dp[lchild]);}p=child[p][bit];}returnans;}voidreset(){for(inti=0;i<=sz;i++){child[i][0]=child[i][1]=dp[i]=0;}sz=1;}voidsolve(vector<int>&a){intn=a.size();intans=0;for(inti=0;i<n;i++){intdp_val=1+query(a[i]);insert(a[i],dp_val);ans=max(ans,dp_val);}cout<<ans<<"\n";}intmain(){ios_base::sync_with_stdio(false);cin.tie(NULL);intn;cin>>n;vector<int>a(n);for(inti=0;i<n;i++){cin>>a[i];}solve(a);}