Pagini recente » Cod sursa (job #2149522) | Cod sursa (job #1404312) | Cod sursa (job #258578) | Cod sursa (job #2765572) | Cod sursa (job #1634383)
#include <cstdio>
using namespace std;
const int N=100005;
int v[N],best[N],p[N];
int dim;
FILE *in,*out;
void scrie(int poz)
{
if(p[poz]==0)
{
fprintf(out,"%d ",v[poz]);
return ;
}
else
scrie(p[poz]);
fprintf(out,"%d ",v[poz]);
}
int caut(int x)
{
int pas=1<<18,poz=0;
while(pas>=1)
{
if(poz+pas<=dim && v[best[poz+pas]]<x)
{
poz=poz+pas;
}
pas=pas/2;
}
if(poz==dim)
dim++;
return poz+1;
}
int main()
{
in=fopen("scmax.in","r");
out=fopen("scmax.out","w");
int n,i,l;
fscanf(in,"%d",&n);
for(i=1;i<=n;i++)
fscanf(in,"%d",&v[i]);
for(i=1;i<=n;i++)
{
l=caut(v[i]);
p[i]=best[l-1];
best[l]=i;
}
fprintf(out,"%d\n",dim);
scrie(best[dim]);
return 0;
}