Pagini recente » Cod sursa (job #2255382) | Cod sursa (job #616140) | Cod sursa (job #2511547) | Cod sursa (job #2085300) | Cod sursa (job #2174237)
#include <cstdio>
using namespace std;
int v[100010],v1[100010],d[100010],tata[100010],rez[100010];
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,l=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&v[i]);
v1[++l]=1;
d[1]=1;
for(int i=2;i<=n;i++)
{
int st=1,dr=l;
while(st<=dr)
{
int mid=(st+dr)/2;
if(v[i]>v[v1[mid]]) st=mid+1;
else dr=mid-1;
}
if(st>l) {l++;v1[l]=i;d[i]=d[v1[l-1]]+1;tata[i]=v1[l-1];}
else {v1[st]=i;d[i]=d[v1[st-1]]+1;tata[i]=v1[st-1];}
}
int sol=0,poz,l1=0;
for(int i=1;i<=n;i++) if(d[i]>sol) {sol=d[i];poz=i;}
printf("%d\n",sol);
while(poz>0)
{
rez[++l1]=v[poz];
poz=tata[poz];
}
for(int i=l1;i>=1;i--) printf("%d ",rez[i]);
return 0;
}