Pagini recente » Cod sursa (job #256477) | Cod sursa (job #426799) | Cod sursa (job #1870175) | Cod sursa (job #2844365) | Cod sursa (job #908826)
Cod sursa(job #908826)
#include<stdio.h>
#define max 100001
int A[max];
int tail[max],prev[max];
int Length,Max;
int celiIndex(int l,int r,int key)
{
int m;
while( (r-l)>1 )
{
m=(r-l)/2+l;
(A[tail[m]] >= key ? r:l) = m;
}
return r;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&Length);
for(int i=1;i<=Length;i++) scanf("%d",&A[i]);
tail[0]=0;
prev[0]=-1;
int len=1;
for(int i=1;i<=Length;i++)
{
if(A[tail[0]]>A[i])
tail[0]=i;
else if(A[tail[len-1]]<A[i])
{
prev[i]=tail[len-1];
tail[len++]=i;
}
else
{
int pos=celiIndex(-1,len-1,A[i]);
prev[i]=tail[pos-1];
tail[pos]=i;
}
}
printf("%d\n",len-1);
int j=1;
for(int i=tail[len-1];i>0;i=prev[i])
tail[j++]=A[i];
for(int i=j-1;i>=1;i--)
printf("%d ",tail[i]);
return 0;
}