Cod sursa(job #870922)

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