Pagini recente » Cod sursa (job #276810) | Cod sursa (job #2315592) | Cod sursa (job #3002835) | Cod sursa (job #217674) | Cod sursa (job #2137786)
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int v[100001],t[100001],b[100001],a[100001],lungime,n,q,d;
int binarysearch(int v[],int l,int r,int k)
{
while(r-l>1)
{
int m=l+(r-l)/2;
if(v[m]>=k)
r=m;
else
l=m;
}
return r;
}
int LIS(int v[])
{
t[0]=v[0];
a[0]=-1;
lungime=1;
for(int i=1; i<=n; i++)
{
if(v[i]<t[0])
{
t[0]=v[i];
b[0]=i;
a[i]=-1;
}
else if(v[i]>t[lungime-1])
{
t[lungime]=v[i];
b[lungime]=i;
a[i]=b[lungime-1];
lungime++;
}
else
{
int h=binarysearch(t,-1,lungime-1,v[i]);
t[h]=v[i];
b[h]=i;
a[i]=b[h-1];
}
}
return lungime;
}
void recursiv(int x,int v[])
{
if(a[x]!=-1)
recursiv(a[x],v);
g<<v[x]<<" ";
}
int main()
{
f>>n;
for(int i=0; i<n; i++)
f>>v[i];
q=LIS(v);
g<<q<<endl;
if(q>1)
{
d=b[q-1];
recursiv(d,v);
}
else
g<<v[0];
return 0;
}