Cod sursa(job #870919)

Utilizator MefistossMefistoss Mefistoss Data 4 februarie 2013 08:51:23
Problema Subsir crescator maximal Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>    
int n, v[100003], b[100003], p[100003], maxim, k, L[100003],s[100003], nr; 
  
void afis(int i) 
{ 
   if (p[i] > 0)  afis(p[i]); 
   printf("%d ",v[i]); 
} 
  
int caut(int x) 
{ 
   int p, u, m; 
   p = 0; u = nr; m = (p+u)/2; 
   while (p <= u) 
   { 
      if (v[L[m]] < x &&  v[L[m+1]] >= x) return m; 
      else if (v[L[m+1]] < x) {p = m + 1; m = (p + u)/2;} 
      else {u = m - 1; m = (p + u)/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; 
   } 
   poz = 1; 
   for (i = 2; i <= n; i++) 
       if (b[poz] < b[i]) poz = i; 
   printf("%d\n",b[poz]); 
  // afis(poz); 
	   for(i=1;i<=nr;++i) printf("%d ",v[L[i]]);
	printf("\n");
   return 0;    
}