namespace LIS { template <class T> int lis(vector<T> v) { if(v.empty())return 0; vector<T> d; for(int i=0;i<v.size();i++) { int l=0,r=d.size(),m=0; while(l<r) { m=(l+r)/2; if(!(v[i]<d[m])) l=m+1; else r=m; } if(l==d.size()) d.push_back(v[i]); else d[l]=v[i]; } for(int i=0;i<d.size();i++) cout<<d[i]<<' '; return d.size(); } template <class T,class C> int lis(vector<T> v,C cmp) { if(v.empty())return 0; vector<T> d; for(int i=0;i<v.size();i++) { int l=0,r=d.size(),m=0; while(l<r) { m=(l+r)/2; if(!cmp(v[i],d[m])) l=m+1; else r=m; } if(l==d.size()) d.push_back(v[i]); else d[l]=v[i]; } return d.size(); } }