Cod sursa(job #1109164)

Utilizator MutescuMutescu Alexandru Mutescu Data 16 februarie 2014 19:43:52
Problema Subsir crescator maximal Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <cstdio>   
int n, v[100003], b[100003], p[100003], ma, k, L[100003], nr;
 
void afis(int i)
{
   if (p[i]>0)afis(p[i]);
   printf("%d ",v[i]);
}
 
int caut(int x)
{
   int st,dr,mid;
   st=0;
   dr=nr;
   mid=(st+dr)/2;
   while(st<=dr)
   {if (v[L[mid]]<x && v[L[mid+1]]>=x)
		  return mid;
      else 
		  if(v[L[mid+1]]<x) 
		  {st=mid+1; 
		  mid=(st+dr)/2;
		  }
      else 
	  {dr=mid-1;
	  mid=(st+dr)/2;
	  }
   }
   return nr;
}
 
int main()
{
   freopen("scmax.in","r",stdin);
   freopen("scmax.out","w",stdout);
   int i,j,poz;
   nr=1;
 
   scanf("%d",&n);
   for (i=1;i<=n;i++) scanf("%d",v+i);
   b[1]=L[1]=1;L[0]=0;
 
   for (i=2;i<=n;i++)
   {poz=caut(v[i]);
      p[i]=L[poz];
      b[i]=poz+1;
      L[poz+1]=i;
      if (nr<poz+1)   
		  nr=poz+1;
   }
   ma=0; poz=0;
   for (i=1;i<=n;i++)
       if(ma<b[i])
       {ma=b[i]; 
	   poz=i;
       }
   printf("%d\n",ma);
   afis(poz);
   return 0;   
}