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();
}
}