Pagini recente » Cod sursa (job #2740965) | Cod sursa (job #1449278) | Cod sursa (job #2902721) | Cod sursa (job #1891348) | Cod sursa (job #561613)
Cod sursa(job #561613)
#include <string.h>
#include <stdio.h>
int d[100002],v[100002],sol[100002];
int i,size,pos,N;
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;
while(size&&i<=N)
{
while(sol[i]!=size&&i<=N) i++;
printf("%d ",v[i]);
i--;
size--;
}
return 0;
}