Pagini recente » Cod sursa (job #2679857) | Cod sursa (job #2449448) | Cod sursa (job #2186270) | Cod sursa (job #581433) | Cod sursa (job #1860727)
#include <cstdio>
using namespace std;
int n,nr,i,j,poz,maxim;
int a[100002],L[100002],P[100002],best[100002];
int q(int x)
{
int p=0,u=nr,m;
m=(p+u)/2;
while(p<=u)
{
if(a[L[m]]<x&&a[L[m+1]]>=x)return m;
else if(a[L[m+1]]<x)
{
p=m+1;
m=(p+u)/2;
}
else
{
u=m-1;
m=(p+u)/2;
}
}
return nr;
}
void afis(int i)
{
if(P[i]>0) afis(P[i]);
printf("%d ",a[i]);
}
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]);
L[1]=best[1]=1;
L[0]=0;
nr=1;
for(i=2;i<=n;i++)
{
poz=q(a[i]);
P[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1)
nr=poz+1;
}
maxim=poz=0;
for(i=1;i<=n;i++)
if(maxim<best[i])
maxim=best[i],poz=i;
printf("%d\n",maxim);
afis(poz);
return 0;
}