Pagini recente » Cod sursa (job #3156803) | Cod sursa (job #1209747) | Cod sursa (job #3127590) | Cod sursa (job #674049) | Cod sursa (job #180223)
Cod sursa(job #180223)
#include <stdio.h>
#define MAXN 100005
#define MAXL MAXN*16
int n,v[MAXN];
int count[MAXN];
int poz[MAXN];
int val[MAXN],m;
int R[MAXN];
int sercibin(int k)
{
int t=1,l=1,r=m;
while (l<r)
{
t=(l+r)/2;
if (k<=v[val[t]])
r=(l+r)/2;
else
l=(l+r)/2+1;
}
return r;
}
void serciwtf()
{
int t,i;
count[0]=0;
poz[0]=0;
val[1]=1; m=1;
for (i=2; i<=n; i++)
{
t=sercibin(v[i]);
if (v[val[t]]>=v[i])
{
val[t]=i;
poz[i]=val[t-1];
count[i]=t-1;
}
else
{
count[i]=t;
poz[i]=val[t];
val[t+1]=i;
if (t+1>m)
m++;
}
}
}
void citire()
{
char c[MAXL]; int i,j,x;
scanf("%d",&n);
fgets(c,100,stdin);
fgets(c,MAXL,stdin);
for (i=1,j=0; i<=n; ++i,++j)
{
x=0;
while (c[j]>='0' && c[j]<='9')
x=x*10+c[j++]-'0';
v[i]=x;
}
}
void afisare()
{
int max=0,j,i;
for (i=n; i>0; i--)
if (count[max]<count[i])
max=i;
printf("%d\n",count[max]+1);
R[m]=v[val[m]];
for (i=count[max],j=poz[max]; i; i--,j=poz[j])
R[i]=v[j];
printf("%d",R[1]);
for (i=2; i<=m; i++)
printf(" %d",R[i]);
printf("\n");
}
int main()
{
freopen("scmax.in","r",stdin);
freopen("scmax.out","w",stdout);
citire();
serciwtf();
afisare();
fclose(stdin);
fclose(stdout);
return 0;
}