Cod sursa(job #855502)
#include <fstream>
using namespace std;
ifstream f("scmax.in");
ofstream g("scmax.out");
int a[100001],b[100001],m[100001],p[100001],n,l=1;
int cautare(int st,int dr,int i)
{
if(st<=dr && st && dr)
{
int mij,x;
mij=(st+dr)/2;
if(a[m[mij]]>=a[i]) return cautare(st,mij-1,i);
else
{
x=cautare(mij+1,dr,i);
if(x) return x;
else return mij;
}
}
else return 0;
}
void solutie(int k)
{
if(k>1)
{
solutie(p[k]);
g<<a[k]<<' ';
}
}
int main()
{
int i,j;
f>>n;
m[1]=1;
for(i=1;i<=n;i++)
f>>a[i];
p[1]=0;
for(i=2;i<=n;i++)
{
j=cautare(1,l,i);
b[i]=j+1;
if(b[i]>l) l=b[i];
if(a[m[j+1]]>a[i] || !m[j+1]) m[j+1]=i;
p[i]=m[j];
}
g<<l<<endl;
solutie(m[l]);
}