Pagini recente » Cod sursa (job #2622817) | Cod sursa (job #1005799) | Cod sursa (job #2889917) | Cod sursa (job #771655) | Cod sursa (job #979010)
Cod sursa(job #979010)
#include <cstdio>
using namespace std;
int cb(int st[100069], int m, int h)
{
int p1,p2,mij,pos;
p1=1; p2=m; pos=0;
while (p1<=p2 && !pos)
{
mij=(p1+p2)/2;
if (st[mij]<h) p1=mij+1;
else if (st[mij]>h) p2=mij-1;
else pos=mij;
if (p1>p2) pos=p1;
else if (st[mij]<h && st[mij+1]>h && mij+1<m) pos=mij+1;
}
return pos;
}
int n,a[100069],poz[100069],st[100069],m,u[100069],i,pos,k;
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d", &n);
for (i=1;i<=n;i++) scanf("%d", &a[i]);
st[1]=a[1]; poz[1]=1; m=1;
for (i=2;i<=n;i++)
{
pos=cb(st,m,a[i]);
st[pos]=a[i]; if (pos>m) m++;
poz[i]=pos;
}
for (i=n;i>=1;i--)
if (poz[i]==m) {u[++k]=a[i]; m--;}
printf("%d\n", k);
for (i=k;i>=1;i--) printf("%d ",u[i]);
return 0;
}