Pagini recente » Monitorul de evaluare | Cod sursa (job #1656626) | Cod sursa (job #145465) | Cod sursa (job #1657018) | Cod sursa (job #1077048)
# include <cstdio>
using namespace std;
int i,j,N,k,l,r,poz,m;
int sol[100002],x[100002],L[100002];
int main ()
{
freopen ("scmax.in", "r", stdin);
freopen ("scmax.out", "w", stdout);
scanf ("%d", &N);
for (i=1; i<=N; ++i)
scanf ("%d", &x[i]);
k = 0; sol[0] = 0;//sau ceva foarte mic
for (i=1; i<=N; ++i)
{
if (x[i]>sol[k]) sol[++k]=x[i], L[i]=k;
else
{
// caut binar poz. celui mai mic A[] <a[i]
l=1; r=k; poz=k;
while (l<=r)
{
m=(l+r)/2;
if (sol[m]<x[i]) l=m+1;
else poz=m, r=m-1;
}
sol[poz]=x[i];
L[i]=poz;
}
}
printf("%d\n", k);
for (i=N, j=0; i>0 && k; --i)
if (L[i]==k) sol[++j]=x[i], --k;
for (i=j; i>0; --i)
printf("%d ", sol[i]);
return 0;
}