Pagini recente » Cod sursa (job #1507547) | Cod sursa (job #1608905) | Cod sursa (job #3033506) | Cod sursa (job #326460) | Cod sursa (job #326244)
Cod sursa(job #326244)
#include<stdio.h>
long n;
long v[100010],q[100010],p[100010];
void read()
{
scanf("%ld",&n);
long i;
for (i=1;i<=n;i++)
{
scanf("%ld",&v[i]);
}
}
long cautbin(long st,long dr,long x)
{
long m,p;
p=0;
while (st<=dr)
{
m=(st+dr)/2;
if (q[m]>=x)
{
p=m;
dr=m-1;
}
else {st=m+1;}
}
return p;
}
void rez()
{
long i;
q[0]=1;
q[1]=v[1];
p[1]=1;
p[0]=1;
long k;
for (i=2;i<=n;i++)
{
k=cautbin(1,q[0],v[i]);
if (k==0)
{
q[++q[0]]=v[i];
p[++p[0]]=q[0];
}
else {
q[k]=v[i];
p[++p[0]]=k;
}
}
printf("%ld\n",q[0]);
}
void sol(long k,long x)
{
if (x==0)
return;
long i;
for (i=k;i>=1;i--)
if (p[i]==x)
break;
sol(i,x-1);
printf("%ld ",v[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
read();
rez();
long i;
sol(p[0],q[0]);
return 0;
}