Pagini recente » Cod sursa (job #2701616) | Cod sursa (job #1399688) | Cod sursa (job #1866515) | Cod sursa (job #3264555) | Cod sursa (job #1984626)
int v[100001],sol[100001],poz[100001],d[100001];
#include<stdio.h>
using namespace std;
int main(){
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
int n,i,k,nr,p1,p2,m,cm,maxx,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
sol[1]=v[1];
poz[1]=1;
k=1;
for(i=2;i<=n;i++){
nr=v[i];
if(nr>sol[k]){
sol[k+1]=nr;
k++;
poz[i]=k;
}
else{
p1=1;
p2=k;
while(p1<=p2){
m=(p1+p2)/2;
if(sol[m]<nr){
p1=m+1;
}
else{
p2=m-1;
cm=m;
}
}
sol[cm]=nr;
poz[i]=cm;
}
}
maxx=-1;
for(i=n;i>=1;i--){
if(poz[i]>maxx){
maxx=poz[i];
cm=i;
}
}
printf("%d\n",maxx);
nr=maxx;
k=1;
for(i=n;i>=1;i--){
if(poz[i]==nr){
d[k]=v[i];
k++;
nr--;
}
}
for(i=k-1;i>=1;i--)
printf("%d ",d[i]);
return 0;
}