Cod sursa(job #269147)
#include<stdio.h>
#define Nmax 101000
long po,v[Nmax],poz,nr,mij,n,l[Nmax],sol[Nmax],max;
struct vector
{
long inf;
long prev;
}a[Nmax];
void citire()
{
freopen("scmax.in","r",stdin);
scanf("%ld",&n);
for(long i=1;i<=n;i++)
scanf("%ld",&a[i]);
fclose(stdin);
}
long cautare(long k)
{
int p=1,u=nr;
while(p<=u)
{ mij=(p+u)/2;
if(a[k].inf<=a[v[mij]].inf)
u=mij-1;
else
p=mij+1;
}
return p;
}
void dinamic()
{
nr=0;max=0;
for(long i=1;i<=n;i++)
{ poz=cautare(i);
v[poz]=i;
a[i].prev=v[poz-1];
l[i]=poz;
if(poz>nr)
nr=poz;
if(max<l[i])
{
max=l[i];
po=i;
}
}
}
void afis(long po)
{
if(a[po].prev!=0)
afis(a[po].prev);
printf("%ld ",a[po].inf);
}
void afisare()
{
freopen("scmax.out","w",stdout);
printf("%ld\n",max);
afis(po);
printf("\n");
fclose(stdout);
}
int main()
{
citire();
dinamic();
afisare();
return 0;
}