Pagini recente » Cod sursa (job #728089) | Cod sursa (job #2670634) | Cod sursa (job #824000) | Cod sursa (job #2130390) | Cod sursa (job #1895593)
#include <cstdio>
using namespace std;
int v[100001],valori[100001],sol[100001],indice[100001],inainte[100001];
int lungime;
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n;
scanf("%d ",&n);
for (int i=1;i<=n;++i)
{
scanf("%d",&v[i]);
int step=1;
for (;step<=lungime;step<<=1);
int poz=0;
for (;step;step>>=1)
if (poz+step<=lungime && v[i]>valori[poz+step])
poz+=step;
if (poz+1>lungime) lungime=poz+1;
inainte[i]=indice[poz];
indice[poz+1]=i;
valori[poz+1]=v[i];
}
printf("%d\n",lungime);
int poz=indice[lungime],cnt=0;
for (;poz;)
sol[++cnt]=v[poz], poz=inainte[poz];
for (int i=cnt;i>=1;--i)
printf("%d ",sol[i]);
}