Pagini recente » Cod sursa (job #582548) | Cod sursa (job #546446) | Cod sursa (job #71568) | Cod sursa (job #1513192) | Cod sursa (job #396051)
Cod sursa(job #396051)
#include<stdio.h>
int a[100100],b[100100],sol[100100],p[100100];
int main()
{
int n,i,st,dr,L=0,gasit,m;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
{
st=0;
dr=L;
gasit=0;
while(st<=dr&&!gasit)
{
m=(st+dr)>>1;
if(a[b[m]]<a[i]&&(a[i]<a[b[m+1]]||m==L))
gasit=1;
else
if(a[b[m]]>a[i])
dr=m-1;
else
st=m+1;
}
if(gasit)
{
b[m+1]=i;
p[i]=b[m];
if(m==L)
L++;
}
}
i=b[L];
while(i)
{
sol[++sol[0]]=a[i];
i=p[i];
}
printf("%d\n",sol[0]);
for(i=sol[0];i;i--)
printf("%d ",sol[i]);
return 0;
}