Cod sursa(job #661579)

Utilizator suzanicaSuzanica Mihu suzanica Data 14 ianuarie 2012 18:35:14
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <stdio.h>
#define nmax 100001
int a[nmax],sol[nmax],p[nmax],q[nmax],n,k;
void read()
{
	int i;
  freopen("scmax.in","r",stdin);
  scanf("%d\n",&n);
  for(i=1;i<=n;++i)
	  scanf("%d ",&a[i]);
  fclose(stdin);
}
int cautbin(int x,int y)
{
	int st,mij,dr,p;
   st=1; 
   dr=y; 
   p=-1;
  while(st<=dr)
    {
    mij=(st+dr)/2;
    if(q[mij]>=x)
	{
	   p=mij;
	   dr=mij-1;
	}
    else
		st=mij+1;
    }
  if(p==-1)
	  return 0;
    else return p;
}

int solve()
{
	int i,lg,poz;
    lg=0;
   for(i=1;i<=n;++i)
    {
      poz=cautbin(a[i],lg);
      if(poz)
	  {
		  q[poz]=a[i]; 
		  p[i]=poz; 
	  }
	else 
	{ 
		lg++;
		q[lg]=a[i];
		p[i]=lg;
	 }
  }
  return lg;
}

void reconstructsol(int lg)
{
	int i;
   k=0;
for(i=n;i>=1;--i)
    if(p[i]==lg)
	{
	  k++;
	  sol[k]=a[i]; 
	  lg--;
	}
}

void write(int lg)
{ 
	int i;
   freopen("scmax.out","w",stdout);
  printf("%d\n",lg);
  for(i=k;i>=1;--i)
	  printf("%d ",sol[i]);
  fclose(stdout);
}

int main()
{
	int lg;
    read();
    lg=solve();
    reconstructsol(lg);
    write(lg);
    return 0;
}