Pagini recente » Cod sursa (job #2726598) | Cod sursa (job #2708628) | Cod sursa (job #1467022) | Cod sursa (job #324524) | Cod sursa (job #175947)
Cod sursa(job #175947)
#include <stdio.h>
int n,a[100001],l[100001],best[100001],p[100001],nr;
int caut(int x)
{
int st=0,sf=nr,m=(st+sf)/2;
while (st<=sf)
{
if (a[l[m]]<x&&a[l[m+1]]>=x)
return m;
if (a[l[m+1]]<x)
{
st=m+1;
m=(st+sf)/2;
}
else
{
sf=m-1;
m=(st+sf)/2;
}
}
return nr;
}
void afis(int x)
{
if (p[x])
afis(p[x]);
printf("%d ",a[x]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
int i,poz,max,pm;
for (i=1;i<=n;i++)
scanf("%d",&a[i]);
l[1]=best[1]=1;
nr=1;
for (i=2;i<=n;i++)
{
poz=caut(a[i]);
best[i]=poz+1;
p[i]=l[poz];
l[poz+1]=i;
if (poz+1>nr)
nr=poz+1;
}
max=best[1];
pm=1;
for (i=2;i<=n;i++)
if (best[i]>max)
{
max=best[i];
pm=i;
}
printf("%d\n",max);
afis(pm);
printf("\n");
return 0;
}