Pagini recente » Cod sursa (job #357957) | Cod sursa (job #2574413) | Cod sursa (job #618599) | Cod sursa (job #2502126) | Cod sursa (job #1333892)
#include<cstdio>
using namespace std;
int n,v[100001],lm,l[100001],pozi[100001],tata[100001],vec[100001];
int caut(int x){
int l1,l2,m,ret;
if(lm==0||v[l[lm]]<x){
lm++;
return lm;
}
l1=1;
l2=lm;
ret=0;
while(l1<=l2){
m=(l1+l2)/2;
if(v[l[m]]==x)
return m;
if(v[l[m]]<x){
l1=m+1;
ret=m;
}
else
if(v[l[m]]>x)
l2=m-1;
}
return ret+1;
}
int main(){
int poz;
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
scanf("%d",&n);
lm=0;
for(int i=1;i<=n;i++){
scanf("%d",&v[i]);
poz=caut(v[i]);
l[poz]=i;
tata[i]=l[poz-1];
}
printf("%d\n",lm);
int afis=l[lm];
int i=0;
while(afis>0){
//printf("%d ",v[afis]);
vec[++i]=v[afis];
afis=tata[afis];
}
for(int i=lm;i>=1;i--)
printf("%d ",vec[i]);
return 0;
}