Pagini recente » Cod sursa (job #2206003) | Cod sursa (job #963825) | Cod sursa (job #1035214) | Cod sursa (job #1686009) | Cod sursa (job #380302)
Cod sursa(job #380302)
#include<stdio.h>
#define DIM 100003
struct lungime
{
int x,p;
} lung[DIM];
int n,a[DIM],max2,prec[DIM];
void read ()
{
int i;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
}
void solve ()
{
int i,st,dr,mij,ind,max;
for(i=1;i<=n;++i)
{
lung[i].x=1<<30;
max=0;
st=1,dr=max2;
while(st<=dr)
{
mij=(st+dr)/2;
if(lung[mij].x<a[i])
{
max=mij;
ind=lung[mij].p;
st=mij+1;
}
else
dr=mij-1;
}
prec[i]=ind;
if(max2<max+1)
max2=max+1;
if(lung[max+1].x>a[i])
{
lung[max+1].x=a[i];
lung[max+1].p=i;
}
}
}
void show ()
{
int i,b[DIM],ind;
printf("%d\n",max2);
ind=lung[max2].p;
for(i=max2;i>0;--i,ind=prec[ind])
b[i]=a[ind];
for(i=1;i<=max2;++i)
printf("%d ",b[i]);
}
int main ()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
read ();
solve ();
show ();
return 0;
}