Pagini recente » Cod sursa (job #2459967) | Cod sursa (job #1987500) | Cod sursa (job #2612278) | Cod sursa (job #2289362) | Cod sursa (job #1465606)
#include <cstdio>
#define nmax 100005
using namespace std;
int n,a[nmax],t[nmax],l[nmax],v[nmax],st[nmax],vf,nrv;
void citire()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
}
int caut_bin(int k)
{
int m,li=1,lf=nrv;
while(li<=lf)
{
m=(li+lf)/2;
if(a[v[m]]==a[k])
return m;
if(a[v[m]]<a[k])
{
li=m+1;
continue;
}
lf=m-1;
}
return li;
}
int maxim(int a,int b)
{
if(a>b)
return a;
return b;
}
void rezolv()
{
for(int i=1;i<=n;i++)
{
int k=caut_bin(i);
l[i]=k;
t[i]=v[k-1];
v[k]=i;
nrv=maxim(nrv,k);
}
int mxm=-1,pozmxm;
for(int i=1;i<=n;i++)
if(l[i]>mxm)
{
mxm=l[i];
pozmxm=i;
}
st[++vf]=pozmxm;
int i=pozmxm;
while(t[i]!=0)
st[++vf]=i=t[i];
}
void afisare()
{
printf("%d\n",vf);
for(int i=vf;i>=1;i--)
printf("%d ",a[st[i]]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
rezolv();
afisare();
return 0;
}