Cod sursa(job #1757238)

Utilizator dodecagondode cagon dodecagon Data 14 septembrie 2016 18:55:44
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.89 kb
#include <stdio.h>

#define min(a,b) ((a)<(b) ? (a):(b))

int n,d[100009],a[100009],i,j,k,p,sol[100009],id[100009];

FILE *in , * out;


int s(int x)
{
   int pp=p,i=0;
   while (pp)
   	 {
   	 	if (i+pp<n && d[i+pp]<x) i+=pp;
   	 	pp/=2;
   	 }

   return i;
}

void sh(int i)
{
	if (i!=-1)
	{
		sh(sol[i]);
    	fprintf(out,"%d ",a[i]);
    }
}


int main()
{
   in = fopen("scmax.in","r");
   out= fopen("scmax.out","w");

     fscanf(in,"%d",&n);

     for (p=1;p<n;p*=2) ;


     for (i=0;i<n;++i)
     	fscanf(in,"%d",a+i);
  
   for (i=1;i<=n;++i) d[i]=2000000009;
     d[0]=-1;
     id[0]=-1;
     
     for (i=0;i<n;++i)
     {
     	k=s(a[i]);
     	if (d[k+1]>a[i])
     	{
     		id[k+1]=i;
     		d[k+1]=a[i];
     	}

     	sol[i]=id[k];
     }
  
    for (i=n;d[i]==2000000009;--i) ;

    	fprintf(out,"%d\n",i);

         sh(id[i]);
    	
     
   fclose(in);
   fclose(out);

	return 0;
}