Pagini recente » Cod sursa (job #3189368) | Cod sursa (job #13427) | Cod sursa (job #405702) | Cod sursa (job #2378973) | Cod sursa (job #1717344)
#include <iostream>
#include <cstdio>
using namespace std;
int n,v[100010],sol[100010],poz[100010],k=1,pozmax=1;
void citire()
{
scanf("%d",&n);
for (int i=1;i<=n;++i)
scanf("%d",&v[i]);
}
int caut(int nr)
{
int st=1,dr=k;
while(st<=dr)
{
int mij=(st+dr)/2;
if (sol[mij]<nr)
st=mij+1;
else
dr=mij-1;
}
return dr+1;
}
void afis(int i)
{
if (poz[i]>1)
for (int j=i-1;j>=1;--j)
if(poz[j]==poz[i]-1 && v[j]<v[i])
{
afis(j);
break;
}
printf("%d ",v[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
poz[1]=1;
sol[1]=v[1];
for (int i=2;i<=n;i++)
{
int poziz=caut(v[i]);
poz[i]=poziz;
sol[poziz]=v[i];
if (poziz>k)
{
++k;
pozmax=i;
}
}
printf("%d\n",k);
afis(pozmax);
return 0;
}