Pagini recente » Cod sursa (job #1816201) | Cod sursa (job #98134) | Cod sursa (job #215343) | Cod sursa (job #1791960) | Cod sursa (job #1424701)
#include<cstdio>
#include<algorithm>
#include<cstring>
#define Nmax 100005
using namespace std;
int n,i,j,v[Nmax],k,p;
int ultim[Nmax],nr,w[Nmax];
int cb(int x)
{
int st=1,dr=nr,mij;
while (st <= dr)
{
mij=(st+dr)/2;
if (v[mij]<v[x] && v[mij+1]>=v[x]) return mij;
if (v[mij]<v[x])
st=mij+1;
else dr=mij-1;
}
return 0;
}
int sol[Nmax];
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]);
if (i==1)
{
ultim[++nr]=i;
continue ;
}
if (v[i]>v[ultim[nr]]
)
{
w[i]=ultim[nr];
ultim[++nr]=i;
k=i;
}else
{
p=cb(v[i]);
if (p==0) ++p;
ultim[p]=i;
w[i]=p-1;
}
}
printf("%d\n",nr);
while (k)
{
sol[++sol[0]]=v[k];
k=w[k];
}
for (i=sol[0];i>=1;--i)
printf("%d ",sol[i]);
return 0;
}