Pagini recente » Cod sursa (job #165717) | Cod sursa (job #1187772) | Cod sursa (job #1041041) | Cod sursa (job #127932) | Cod sursa (job #2481720)
#include <cstdio>
using namespace std;
long long n,v[100003],stiva[100003],best[100003],k,maxim,poz,last;
long long c_binara (long long prima,long long ultima,long long nr)
{
if(stiva[1]>=nr)
return 0;
while(prima<=ultima)
{
k=(prima+ultima)/2;
if(stiva[k]<nr && (k==last || stiva[k+1]>=nr))
return k;
else if(stiva[k]<nr)
prima=k+1;
else if(stiva[k]>nr)
ultima=k-1;
}
}
void sc_max ()
{
last=0;
stiva[++last]=v[1];best[1]=1;
for(int i=2;i<=n;++i)
{
last=c_binara(1,last,v[i]);
stiva[++last]=v[i];best[i]=last;
if(best[i]>maxim)
maxim=best[i],poz=i;
}
}
int main ()
{
long long sol[100003],aux;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%lld", &n);
for(int i=1;i<=n;++i)
scanf("%lld", &v[i]);
sc_max();
printf("%lld\n", maxim);
sol[maxim]=v[poz];aux=maxim;
for(int i=poz-1;i>0;--i)
if(best[i]==maxim-1 && v[i]<sol[maxim])
sol[--maxim]=v[i];
for(int i=1;i<=aux;++i)
printf("%lld ", sol[i]);
return 0;
}