Pagini recente » Cod sursa (job #576537) | Cod sursa (job #469652) | Cod sursa (job #910351) | Cod sursa (job #2322690) | Cod sursa (job #1142736)
#include <cstdio>
using namespace std;
int n, i, k, lmax, x, p, u, v[100005], prec[100005], l[100005], b[100005], s[100005];
int main()
{
freopen("scmax.in", "r", stdin);
freopen("scmax.out", "w", stdout);
scanf("%d", &n);
scanf("%d", &v[1]);
prec[1]=0;
b[1]=1;
l[1]=1;
lmax=1;
for(i=2;i<=n;i++)
{
scanf("%d", &v[i]);
if(v[i]<=v[l[1]])
{
l[1]=i;
b[i]=1;
prec[i]=0;
}
else if(v[i]>v[l[lmax]])
{
lmax++;
l[lmax]=i;
prec[i]=l[lmax-1];
b[i]=lmax;
}
else
{
p=1;
u=lmax;
while(p<=u)
{
k=(p+u)/2;
if(v[l[k]]>=v[i]&&v[l[k-1]]<v[i])
{
b[i]=k;
prec[i]=l[k-1];
if(v[i]<v[l[k]]) l[k]=i;
break;
}
else if(v[l[k]]>v[i]) u=k-1;
else if(v[l[k]]<v[i]) p=k+1;
}
}
}
printf("%d\n", lmax);
s[lmax]=v[l[lmax]];
x=prec[l[lmax]];
for(i=lmax-1;i>=1;i--)
{
s[i]=v[x];
x=prec[x];
}
for(i=1;i<=lmax;i++)
printf("%d ", s[i]);
return 0;
}