Pagini recente » Cod sursa (job #1169694) | Cod sursa (job #3231317) | Cod sursa (job #3254215) | Cod sursa (job #3197422) | Cod sursa (job #886682)
Cod sursa(job #886682)
#include <cstdio>
using namespace std;
int n,v[100005],best[100005],p[100005],maxim,k,L[100005],nr;
int search(int x){
int p,u,m;
p=0;
u=nr;
m=(p+u)/2;
while(p<=u){
if(v[L[m]]<x && v[L[m+1]]>=x) return m;
else if(v[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",v[i]);
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d ",&v[i]);
}
best[1]=L[1]=1; L[0]=0;
int poz;
nr=1;
for(int i=2;i<=n;++i){
poz=search(v[i]);
p[i]=L[poz];
best[i]=poz+1;
L[poz+1]=i;
if(nr<poz+1) nr=poz+1;
}
maxim=0;poz=0;
for(int i=1;i<=n;++i)
if(maxim<best[i]){
maxim=best[i];
poz=i;
}
printf("%d\n",maxim);
afis(poz);
return 0;
}