Pagini recente » Cod sursa (job #1381685) | Cod sursa (job #416827) | Cod sursa (job #2746449) | Cod sursa (job #1234719) | Cod sursa (job #865145)
Cod sursa(job #865145)
#include <cstdio>
using namespace std;
int n,i,nr,poz,maxi,o,h,l;
int v[100001],lg[100001],b[100001];
int caut(int x)
{ int m,p=1,u=b[0],mx=0;
while (p<=u)
{ m=(p+u)/2;
if(b[m]<x)
{ if(m>mx) mx=m;
p=m+1;
}
else u=m-1;
}
return mx;
}
int main()
{ freopen("scmax.in","r",stdin); freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&v[i]);
b[0]=1; b[1]=v[1]; lg[1]=1;
for(i=2;i<=n;i++)
{ poz=caut(v[i]);
if(poz==b[0]) b[0]++;
b[poz+1]=v[i];
lg[i]=poz+1;
}
maxi=0;
o=0;
for(i=1;i<=n;i++)
if(maxi<lg[i]) {maxi=lg[i];o=i;}
printf("%d\n",maxi);
h=o; l=0;
while(maxi>0)
{ l++; b[l]=v[h];
maxi--;
while(lg[h]!=maxi && h>0) h--;
}
for(i=l;i>=1;i--)
{ //if (b[i]==0) b[i]=1;
printf("%d ",b[i]);
}
return 0;
}