Pagini recente » Cod sursa (job #2112872) | Cod sursa (job #168185) | Cod sursa (job #847838) | Cod sursa (job #2632532) | Cod sursa (job #914849)
Cod sursa(job #914849)
#include <stdio.h>
using namespace std;
FILE *f=fopen("dp2.in","r");
FILE *g=fopen("dp2.out","w");
int i,j,N,k,
A[100],S[100],E[100],M[100],P[100];
int caut(int val)
{
int i,step;
for(step=1;step<k;step<<=1);
for(i=0;step;step>>=1)
if(i+step<k&&E[i+step]<=val)
i+=step;
return i;
}
int main()
{
fscanf(f,"%d",&N);
for(i=1;i<=N;i++)
fscanf(f,"%d",&A[i]);
M[1]=1;
E[1]=A[1];
k=1;
for(i=2;i<=N;i++)
{
if(A[i]>E[k])
{k++; E[k]=A[i]; M[k]=i; P[i]=M[k-1];}
else
{M[caut(A[i])+1]=i; P[i]=M[caut(A[i])]; E[caut(A[i])+1]=A[i];}
}
S[1]=M[k];
for(i=2;i<=k;i++)
S[i]=P[S[i-1]];
fprintf(g,"%d\n",k);
for(i=k;i>=1;i--)
fprintf(g,"%d ",A[S[i]]);
return 0;
}