Cod sursa(job #309817)

Utilizator cosgbCosmin cosgb Data 1 mai 2009 11:35:45
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <stdio.h>
long b[100002],c[100002];
 long cautbin (long a[],long st,long dr,long x)
 {long ok,pivot;
  long m;
  while (st<=dr)
    {m=(st+dr)/2;
     pivot=a[m];
     if (x>pivot)
	 st=m+1;
	 else
	  if (x<pivot)
	     dr=m-1;
	    else
	      return m;

    }
  return st;
 }

 long u;
 long p[100002],q[100002];

 void cmlsc (long k,long v[])
 {long st,i,poz;
  st=1;
  i=2;
  u=1;
  p[1]=v[1];
  q[1]=1;
  while (i<=k)
  {if (v[i]>p[u])
	  {q[i]=u+1;
	   p[++u]=v[i++];
	  }
	  else
  {poz=cautbin(p,st,u,v[i]);
  p[poz]=v[i];
  q[i]=poz;
  i++;
  }
  }
 }

 void final (long d[],long e[],long k)
 { long j,lim,i;
   j=u;
   lim=k;
   while (u!=0)
     {for (i=lim;i>=1;i--)
	 {if (q[i]==u)
	  {d[u]=e[i];
	    u--;
	    lim=i-1;
	  }
	 }
     }
 }








int main()
{ freopen ("scmax.in","r",stdin);
  freopen ("scmax.out","w",stdout);
  long n,i,lmax;
   scanf ("%ld",&n);
   for (i=1;i<=n;i++)
     scanf ("%ld",&b[i]);
  cmlsc (n,b);
  lmax=u;
  printf ("%ld\n",lmax);
  final (c,b,n);
  for (i=1;i<=lmax;i++)
    printf ("%ld ",c[i]);
  fcloseall();
  return 0;
}