Pagini recente » Borderou de evaluare (job #2841567) | Cod sursa (job #2867414) | Cod sursa (job #362602) | Cod sursa (job #1448208) | Cod sursa (job #1390924)
#include <fstream>
#include <stdlib.h>
#define inf 1000000
using namespace std;
ifstream fin ("scmax.in");
ofstream fout ("scmax.out");
int n,i,a[1000001],o[1000001],u,p[1000001],j,x;
int caut(int v,int x,int y)
{
int m=(x+y)/2;
if (x==y) return x;
else if (v>o[m]) return caut(v,m+1,y);
return caut(v,x,m);
}
int cbp(int v)
{
int step,i;
for (step=1;step<=u;step<<=1);
for (i=0;step;step>>=1)
if (i+step<=u&&o[i+step]<=v)
i+=step;
return i;
}
void afis(int n,int u)
{
if (u)
{
int i;
for (i=n;p[i]!=u;i--);
afis(i-1,u-1);
fout<<a[i]<<" ";
}
}
int main()
{
fin>>n;
//for (i=1;i<=1000000;i++) fin<<rand()%1000<<'\n';
for (i=1;i<=n;i++) fin>>a[i];
u=1; o[1]=a[1]; p[1]=1;
o[2]=inf;
for (i=2;i<=n;i++)
{
x=caut(a[i],1,u+1);
o[x]=a[i];
p[i]=x;
if (x==u+1) o[++u+1]=inf;
}
fout<<u<<'\n';
afis(n,u);
return 0;
}