Pagini recente » Cod sursa (job #2667385) | Cod sursa (job #597667) | Cod sursa (job #774644) | Cod sursa (job #1650815) | Cod sursa (job #1333884)
#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||l[lm]<x){
lm++;
return lm;
}
l1=1;
l2=lm;
ret=0;
while(l1<=l2){
m=(l1+l2)/2;
if(l[m]==x)
return m;
if(l[m]<x){
l1=m+1;
ret=m;
}
else
if(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]);
pozi[v[i]]=i;
poz=caut(v[i]);
l[poz]=v[i];
tata[i]=pozi[l[poz-1]];
}
printf("%d\n",lm);
int afis=pozi[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;
}