Pagini recente » Cod sursa (job #2046751) | Istoria paginii utilizator/tebaatusasula | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #793940)
Cod sursa(job #793940)
#include<cstdio>
#include<cmath>
using namespace std;
#define ll long long
#define NMAX 100002
ll a[NMAX],c[NMAX],l[NMAX];
int size=1,k,m;
int cauta(ll c[],ll val,int l,int r)
{
m=(l+r)/2;
if(c[m-1]<val && val<=c[m])return m;
else
if(c[m]>val)cauta(c,val,l,m);
else cauta(c,val,m+1,r);
}
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("%lld",&a[i]);
c[1]=a[1];
l[1]=1;
for(int i=2;i<=n;++i)
{
if(a[i]<=c[1])
{
c[1]=a[i];
l[i]=1;
}
else
if(a[i]>c[size])
{
++size;
c[size]=a[i];
l[i]=size;
}
else
{
k=cauta(c,a[i],1,size);
c[k]=a[i];
l[i]=k;
}
}
printf("%d\n",size);
int sz=size;
int j=0;
ll b[NMAX];
for(int i=n;i&&sz;--i)
if(l[i]==sz)
{
++j;
b[j]=a[i];
--sz;
}
for(int i=j;i;--i)printf("%lld ",b[i]);
return 0;
}
/*
for(int i=1;i<=size;++i)
{
printf( " %lld ",c[i]);
}
printf("\n");
for(int i=1;i<=n;++i)
{
printf(" l[i]= %lld \t a[i]=%lld\t",l[i],a[i]);
}
printf("\n");
*/