Cod sursa(job #914849)

Utilizator Walrus21andrei Walrus21 Data 14 martie 2013 15:22:28
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.8 kb
#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;
}