Pagini recente » Cod sursa (job #2254572) | Cod sursa (job #2867301) | Cod sursa (job #2223267) | Cod sursa (job #1055607) | Cod sursa (job #561622)
Cod sursa(job #561622)
#include <string.h>
#include <stdio.h>
int d[100002],v[100002],sol[100002];
int i,size,pos,N,aux;
int BS(int x,int L,int R)
{
if(L<=R)
{
int M=(L+R)/2;
if(x>d[M]) return BS(x,L,M-1);
else
if(x<d[M]) return BS(x,M+1,R);
else return M;
}
else return L;
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&N);
for(i=1;i<=N;i++) scanf("%d",&v[i]);
memset(d,0,sizeof(d));
memset(sol,0,sizeof(sol));
size=1;
d[1]=v[N];
sol[N]=1;
for(i=N-1;i>0;i--)
{
pos=BS(v[i],1,size+1);
if(pos>size) size=pos;
if(d[pos]<v[i]) d[pos]=v[i];
sol[i]=pos;
}
printf("%d\n",size);
i=1;
aux=-1;
while(size&&i<=N)
{
while(sol[i]!=size&&i<=N&&(aux>=v[i]||aux==-1)) i++;
printf("%d ",v[i]);
aux=v[i];
i++;
size--;
}
return 0;
}